1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* ttinterp.c */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* TrueType bytecode interpreter (body). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* Copyright 1996-2013 */ 8aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich/* by David Turner, Robert Wilhelm, and Werner Lemberg. */ 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* This file is part of the FreeType project, and may only be used, */ 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* modified, and distributed under the terms of the FreeType project */ 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* this file you indicate that you have read the license and */ 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* understand and accept it fully. */ 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 19aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */ 20aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner/* issues; many thanks! */ 21aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 22aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h> 24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_CALC_H 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRIGONOMETRY_H 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_SYSTEM_H 28727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_TRUETYPE_DRIVER_H 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttinterp.h" 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "tterrors.h" 32727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include "ttsubpix.h" 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_USE_BYTECODE_INTERPRETER 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* messages during execution. */ 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_ttinterp 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* In order to detect infinite loops in the code, we set up a counter */ 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* within the run loop. A single stroke of interpretation is now */ 51727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* limited to a maximum number of opcodes defined below. */ 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define MAX_RUNNABLE_OPCODES 1000000L 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* There are two kinds of implementations: */ 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* a. static implementation */ 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The current execution context is a static variable, which fields */ 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* are accessed directly by the interpreter during execution. The */ 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* context is named `cur'. */ 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This version is non-reentrant, of course. */ 67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* b. indirect implementation */ 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The current execution context is passed to _each_ function as its */ 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* first argument, and each field is thus accessed indirectly. */ 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This version is fully re-entrant. */ 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The idea is that an indirect implementation may be slower to execute */ 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* on low-end processors that are used in some systems (like 386s or */ 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* even 486s). */ 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* As a consequence, the indirect implementation is now the default, as */ 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* its performance costs can be considered negligible in our context. */ 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Note, however, that we kept the same source with macros because: */ 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* - The code is kept very close in design to the Pascal code used for */ 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* development. */ 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* - It's much more readable that way! */ 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* - It's still open to experimentation and tuning. */ 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */ 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR (*exc) /* see ttobjs.h */ 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This macro is used whenever `exec' is unused in a function, to avoid */ 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* stupid warnings from pedantic compilers. */ 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_UNUSED_EXEC FT_UNUSED( exc ) 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else /* static implementation */ 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR cur 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_UNUSED_EXEC int __dummy = __dummy 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_ExecContextRec cur; /* static exec. context variable */ 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* apparently, we have a _lot_ of direct indexing when accessing */ 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the static `cur', which makes the code bigger (due to all the */ 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* four bytes addresses). */ 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */ 118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The instruction argument stack. */ 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define INS_ARG EXEC_OP_ FT_Long* args /* see ttobjs.h for EXEC_OP_ */ 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This macro is used whenever `args' is unused in a function, to avoid */ 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* stupid warnings from pedantic compilers. */ 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_UNUSED_ARG FT_UNUSED_EXEC; FT_UNUSED( args ) 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define SUBPIXEL_HINTING \ 136727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( ((TT_Driver)FT_FACE_DRIVER( CUR.face ))->interpreter_version == \ 137727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease TT_INTERPRETER_VERSION_38 ) 138727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 139727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to */ 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* increase readability of the code. */ 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SKIP_Code() \ 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SkipCode( EXEC_ARG ) 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define GET_ShortIns() \ 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GetShortIns( EXEC_ARG ) 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define NORMalize( x, y, v ) \ 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Normalize( EXEC_ARG_ x, y, v ) 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SET_SuperRound( scale, flags ) \ 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SetSuperRound( EXEC_ARG_ scale, flags ) 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ROUND_None( d, c ) \ 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Round_None( EXEC_ARG_ d, c ) 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define INS_Goto_CodeRange( range, ip ) \ 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_Goto_CodeRange( EXEC_ARG_ range, ip ) 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_move( z, p, d ) \ 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move( EXEC_ARG_ z, p, d ) 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_move_orig( z, p, d ) \ 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move_orig( EXEC_ARG_ z, p, d ) 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_round( d, c ) \ 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round( EXEC_ARG_ d, c ) 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_read_cvt( index ) \ 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_read_cvt( EXEC_ARG_ index ) 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_write_cvt( index, val ) \ 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_write_cvt( EXEC_ARG_ index, val ) 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_move_cvt( index, val ) \ 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move_cvt( EXEC_ARG_ index, val ) 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CURRENT_Ratio() \ 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Current_Ratio( EXEC_ARG ) 186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CURRENT_Ppem() \ 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Current_Ppem( EXEC_ARG ) 189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Ppem() \ 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Cur_PPEM( EXEC_ARG ) 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define INS_SxVTL( a, b, c, d ) \ 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SxVTL( EXEC_ARG_ a, b, c, d ) 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define COMPUTE_Funcs() \ 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Compute_Funcs( EXEC_ARG ) 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define COMPUTE_Round( a ) \ 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Compute_Round( EXEC_ARG_ a ) 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define COMPUTE_Point_Displacement( a, b, c, d ) \ 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Compute_Point_Displacement( EXEC_ARG_ a, b, c, d ) 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define MOVE_Zp2_Point( a, b, c, t ) \ 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Move_Zp2_Point( EXEC_ARG_ a, b, c, t ) 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_project( v1, v2 ) \ 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y ) 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_Func_dualproj( v1, v2 ) \ 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y ) 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_fast_project( v ) \ 216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_project( EXEC_ARG_ (v)->x, (v)->y ) 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define CUR_fast_dualproj( v ) \ 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y ) 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Instruction dispatch function, as used by the interpreter. */ 225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project typedef void (*TInstruction_Function)( INS_ARG ); 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 231aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich /* Two simple bounds-checking macros. */ 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 233aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) ) 234aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define BOUNDSL( x, n ) ( (FT_ULong)(x) >= (FT_ULong)(n) ) 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 236727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /*************************************************************************/ 237727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 238727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* This macro computes (a*2^14)/b and complements TT_MulFix14. */ 239727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 240727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define TT_DivFix14( a, b ) \ 241727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_DivFix( a, (b) << 2 ) 242727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 243727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef SUCCESS 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define SUCCESS 0 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FAILURE 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FAILURE 1 249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define GUESS_VECTOR( V ) \ 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.face->unpatented_hinting ) \ 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \ 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \ 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define GUESS_VECTOR( V ) 259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CODERANGE FUNCTIONS */ 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Goto_CodeRange */ 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Switches to a new code range (updates the code related elements in */ 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* `exec', and `IP'). */ 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* range :: The new execution code range. */ 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IP :: The new IP in the new code range. */ 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* exec :: The target execution context. */ 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Goto_CodeRange( TT_ExecContext exec, 290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int range, 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long IP ) 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_CodeRange* coderange; 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ASSERT( range >= 1 && range <= 3 ); 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project coderange = &exec->codeRangeTable[range - 1]; 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ASSERT( coderange->base != NULL ); 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NOTE: Because the last instruction of a program may be a CALL */ 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* which will return to the first byte *after* the code */ 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* range, we test for IP <= Size instead of IP < Size. */ 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ASSERT( (FT_ULong)IP <= coderange->size ); 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->code = coderange->base; 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->codeSize = coderange->size; 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->IP = IP; 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->curRange = range; 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 313727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Set_CodeRange */ 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Sets a code range. */ 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* range :: The code range index. */ 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* base :: The new code base. */ 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* length :: The range size in bytes. */ 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* exec :: The target execution context. */ 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Set_CodeRange( TT_ExecContext exec, 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int range, 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* base, 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long length ) 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ASSERT( range >= 1 && range <= 3 ); 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->codeRangeTable[range - 1].base = (FT_Byte*)base; 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->codeRangeTable[range - 1].size = length; 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 349727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Clear_CodeRange */ 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Clears a code range. */ 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* range :: The code range index. */ 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* exec :: The target execution context. */ 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Note> */ 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Does not set the Error variable. */ 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Clear_CodeRange( TT_ExecContext exec, 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int range ) 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ASSERT( range >= 1 && range <= 3 ); 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->codeRangeTable[range - 1].base = NULL; 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->codeRangeTable[range - 1].size = 0; 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 382727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* EXECUTION CONTEXT ROUTINES */ 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Done_Context */ 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Destroys a given context. */ 400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* exec :: A handle to the target execution context. */ 403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* memory :: A handle to the parent memory object. */ 405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Note> */ 410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Only the glyph loader and debugger should call this function. */ 411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Done_Context( TT_ExecContext exec ) 414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = exec->memory; 416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* points zone */ 419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->maxPoints = 0; 420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->maxContours = 0; 421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* free stack */ 423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( exec->stack ); 424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->stackSize = 0; 425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* free call stack */ 427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( exec->callStack ); 428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->callSize = 0; 429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->callTop = 0; 430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* free glyph code range */ 432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( exec->glyphIns ); 433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->glyphSize = 0; 434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->size = NULL; 436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->face = NULL; 437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( exec ); 439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 440727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Init_Context */ 448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Initializes a context object. */ 451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* memory :: A handle to the parent memory object. */ 454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* exec :: A handle to the target execution context. */ 457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Init_Context( TT_ExecContext exec, 463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec )); 469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->memory = memory; 471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->callSize = 32; 472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) ) 474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail_Memory; 475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* all values in the context are set to 0 already, but this is */ 477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* here as a remainder */ 478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->maxPoints = 0; 479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->maxContours = 0; 480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->stackSize = 0; 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->glyphSize = 0; 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->stack = NULL; 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->glyphIns = NULL; 486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->face = NULL; 488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->size = NULL; 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 490727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Fail_Memory: 4937f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner FT_ERROR(( "Init_Context: not enough memory for %p\n", exec )); 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Done_Context( exec ); 495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Update_Max */ 504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Checks the size of a buffer and reallocates it if necessary. */ 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* memory :: A handle to the parent memory object. */ 510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* multiplier :: The size in bytes of each element in the buffer. */ 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* new_max :: The new capacity (size) of the buffer. */ 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* size :: The address of the buffer's current size expressed */ 517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* in elements. */ 518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* buff :: The address of the buffer base pointer. */ 520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 524aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_LOCAL_DEF( FT_Error ) 525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Update_Max( FT_Memory memory, 526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong* size, 527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long multiplier, 528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void* _pbuff, 529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong new_max ) 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project void** pbuff = (void**)_pbuff; 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( *size < new_max ) 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) ) 538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *size = new_max; 540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 542727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Load_Context */ 550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Prepare an execution context for glyph hinting. */ 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* face :: A handle to the source face object. */ 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* size :: A handle to the source size object. */ 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* exec :: A handle to the target execution context. */ 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Note> */ 566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Only the glyph loader and debugger should call this function. */ 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Load_Context( TT_ExecContext exec, 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Face face, 571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size size ) 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int i; 574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong tmp; 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_MaxProfile* maxp; 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->face = face; 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project maxp = &face->max_profile; 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->size = size; 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( size ) 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->numFDefs = size->num_function_defs; 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->maxFDefs = size->max_function_defs; 587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->numIDefs = size->num_instruction_defs; 588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->maxIDefs = size->max_instruction_defs; 589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->FDefs = size->function_defs; 590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->IDefs = size->instruction_defs; 591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->tt_metrics = size->ttmetrics; 592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->metrics = size->metrics; 593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->maxFunc = size->max_func; 595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->maxIns = size->max_ins; 596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->codeRangeTable[i] = size->codeRangeTable[i]; 599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set graphics state */ 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->GS = size->GS; 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->cvtSize = size->cvt_size; 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->cvt = size->cvt; 605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->storeSize = size->storage_size; 607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->storage = size->storage; 608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->twilight = size->twilight; 6107f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 6117f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* In case of multi-threading it can happen that the old size object */ 6127f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* no longer exists, thus we must clear all glyph zone references. */ 6137f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) ); 6147f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner exec->zp1 = exec->zp0; 6157f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner exec->zp2 = exec->zp0; 616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: We reserve a little more elements on the stack to deal safely */ 619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* with broken fonts like arialbs, courbs, timesbs, etc. */ 620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tmp = exec->stackSize; 621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = Update_Max( exec->memory, 622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &tmp, 623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sizeof ( FT_F26Dot6 ), 624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (void*)&exec->stack, 625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project maxp->maxStackElements + 32 ); 626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->stackSize = (FT_UInt)tmp; 627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tmp = exec->glyphSize; 631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = Update_Max( exec->memory, 632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &tmp, 633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sizeof ( FT_Byte ), 634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (void*)&exec->glyphIns, 635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project maxp->maxSizeOfInstructions ); 636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->glyphSize = (FT_UShort)tmp; 637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->pts.n_points = 0; 641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->pts.n_contours = 0; 642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->zp1 = exec->pts; 644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->zp2 = exec->pts; 645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->zp0 = exec->pts; 646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->instruction_trap = FALSE; 648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 649727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Save_Context */ 657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Saves the code ranges in a `size' object. */ 660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* exec :: A handle to the source execution context. */ 663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* size :: A handle to the target size object. */ 666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FreeType error code. 0 means success. */ 669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Note> */ 671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Only the glyph loader and debugger should call this function. */ 672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Save_Context( TT_ExecContext exec, 675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Size size ) 676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int i; 678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 680aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* XXX: Will probably disappear soon with all the code range */ 681aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* management, which is now rather obsolete. */ 682aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* */ 683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->num_function_defs = exec->numFDefs; 684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->num_instruction_defs = exec->numIDefs; 685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_func = exec->maxFunc; 687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->max_ins = exec->maxIns; 688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) 690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project size->codeRangeTable[i] = exec->codeRangeTable[i]; 691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 692727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* TT_Run_Context */ 700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Executes one or more instructions in the execution context. */ 703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* debug :: A Boolean flag. If set, the function sets some internal */ 706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* variables and returns immediately, otherwise TT_RunIns() */ 707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* is called. */ 708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This is commented out currently. */ 710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* exec :: A handle to the target execution context. */ 713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 7150a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* TrueType error code. 0 means success. */ 716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Note> */ 718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Only the glyph loader and debugger should call this function. */ 719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( FT_Error ) 721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_Run_Context( TT_ExecContext exec, 722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool debug ) 723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 72741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) ) 728727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease != FT_Err_Ok ) 729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->zp0 = exec->pts; 732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->zp1 = exec->pts; 733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->zp2 = exec->pts; 734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->GS.gep0 = 1; 736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->GS.gep1 = 1; 737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->GS.gep2 = 1; 738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->GS.projVector.x = 0x4000; 740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->GS.projVector.y = 0x0000; 741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->GS.freeVector = exec->GS.projVector; 743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->GS.dualVector = exec->GS.projVector; 744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->GS.both_x_axis = TRUE; 747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->GS.round_state = 1; 750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->GS.loop = 1; 751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* some glyphs leave something on the stack. so we clean it */ 753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* before a new execution. */ 754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->top = 0; 755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec->callTop = 0; 756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 1 758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( debug ); 759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return exec->face->interpreter( exec ); 761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !debug ) 763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return TT_RunIns( exec ); 764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 765727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7700a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* The default value for `scan_control' is documented as FALSE in the */ 7710a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* TrueType specification. This is confusing since it implies a */ 7720a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* Boolean value. However, this is not the case, thus both the */ 7730a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* default values of our `scan_type' and `scan_control' fields (which */ 7740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* the documentation's `scan_control' variable is split into) are */ 7750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project /* zero. */ 7760a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const TT_GraphicsState tt_default_graphics_state = 778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0, 0, 0, 780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 0x4000, 0 }, 781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 0x4000, 0 }, 782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 0x4000, 0 }, 783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TRUE, 786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 64, 1, 789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TRUE, 68, 0, 0, 9, 3, 7900a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project 0, FALSE, 0, 1, 1, 1 791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project }; 792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ttinterp.h */ 795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( TT_ExecContext ) 797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_New_Context( TT_Driver driver ) 798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_ExecContext exec; 800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory; 801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memory = driver->root.root.memory; 804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project exec = driver->context; 805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !driver->context ) 807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* allocate object */ 812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_NEW( exec ) ) 813295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner goto Fail; 814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 815295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* initialize it; in case of error this deallocates `exec' too */ 816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = Init_Context( exec, memory ); 817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* store it into the driver */ 821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project driver->context = exec; 822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return driver->context; 825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Fail: 827295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner return NULL; 828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Before an opcode is executed, the interpreter verifies that there are */ 834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* enough arguments on the stack, with the help of the `Pop_Push_Count' */ 835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* table. */ 836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* For each opcode, the first column gives the number of arguments that */ 838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* are popped from the stack; the second one gives the number of those */ 839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* that are pushed in result. */ 840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcodes which have a varying number of parameters in the data stream */ 842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */ 843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the `opcode_length' table, and the value in `Pop_Push_Count' is set */ 844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* to zero. */ 845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef PACK 850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define PACK( x, y ) ( ( x << 4 ) | y ) 851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static 854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Byte Pop_Push_Count[256] = 855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* opcodes are gathered in groups of 16 */ 857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* please keep the spaces as they are */ 858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SVTCA y */ PACK( 0, 0 ), 860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SVTCA x */ PACK( 0, 0 ), 861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPvTCA y */ PACK( 0, 0 ), 862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPvTCA x */ PACK( 0, 0 ), 863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFvTCA y */ PACK( 0, 0 ), 864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFvTCA x */ PACK( 0, 0 ), 865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPvTL // */ PACK( 2, 0 ), 866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPvTL + */ PACK( 2, 0 ), 867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFvTL // */ PACK( 2, 0 ), 868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFvTL + */ PACK( 2, 0 ), 869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPvFS */ PACK( 2, 0 ), 870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFvFS */ PACK( 2, 0 ), 871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GPV */ PACK( 0, 2 ), 872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GFV */ PACK( 0, 2 ), 873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFvTPv */ PACK( 0, 0 ), 874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ISECT */ PACK( 5, 0 ), 875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SRP0 */ PACK( 1, 0 ), 877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SRP1 */ PACK( 1, 0 ), 878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SRP2 */ PACK( 1, 0 ), 879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SZP0 */ PACK( 1, 0 ), 880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SZP1 */ PACK( 1, 0 ), 881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SZP2 */ PACK( 1, 0 ), 882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SZPS */ PACK( 1, 0 ), 883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SLOOP */ PACK( 1, 0 ), 884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RTG */ PACK( 0, 0 ), 885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RTHG */ PACK( 0, 0 ), 886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SMD */ PACK( 1, 0 ), 887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ELSE */ PACK( 0, 0 ), 888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* JMPR */ PACK( 1, 0 ), 889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SCvTCi */ PACK( 1, 0 ), 890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SSwCi */ PACK( 1, 0 ), 891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SSW */ PACK( 1, 0 ), 892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DUP */ PACK( 1, 2 ), 894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* POP */ PACK( 1, 0 ), 895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CLEAR */ PACK( 0, 0 ), 896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SWAP */ PACK( 2, 2 ), 897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DEPTH */ PACK( 0, 1 ), 898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CINDEX */ PACK( 1, 1 ), 899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MINDEX */ PACK( 1, 0 ), 900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* AlignPTS */ PACK( 2, 0 ), 901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$28 */ PACK( 0, 0 ), 902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* UTP */ PACK( 1, 0 ), 903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* LOOPCALL */ PACK( 2, 0 ), 904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CALL */ PACK( 1, 0 ), 905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FDEF */ PACK( 1, 0 ), 906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ENDF */ PACK( 0, 0 ), 907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDAP[0] */ PACK( 1, 0 ), 908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDAP[1] */ PACK( 1, 0 ), 909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IUP[0] */ PACK( 0, 0 ), 911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IUP[1] */ PACK( 0, 0 ), 912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHP[0] */ PACK( 0, 0 ), 913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHP[1] */ PACK( 0, 0 ), 914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHC[0] */ PACK( 1, 0 ), 915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHC[1] */ PACK( 1, 0 ), 916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHZ[0] */ PACK( 1, 0 ), 917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHZ[1] */ PACK( 1, 0 ), 918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHPIX */ PACK( 1, 0 ), 919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IP */ PACK( 0, 0 ), 920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MSIRP[0] */ PACK( 2, 0 ), 921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MSIRP[1] */ PACK( 2, 0 ), 922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* AlignRP */ PACK( 0, 0 ), 923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RTDG */ PACK( 0, 0 ), 924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIAP[0] */ PACK( 2, 0 ), 925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIAP[1] */ PACK( 2, 0 ), 926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NPushB */ PACK( 0, 0 ), 928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NPushW */ PACK( 0, 0 ), 929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* WS */ PACK( 2, 0 ), 930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RS */ PACK( 1, 1 ), 931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* WCvtP */ PACK( 2, 0 ), 932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RCvt */ PACK( 1, 1 ), 933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GC[0] */ PACK( 1, 1 ), 934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GC[1] */ PACK( 1, 1 ), 935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SCFS */ PACK( 2, 0 ), 936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MD[0] */ PACK( 2, 1 ), 937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MD[1] */ PACK( 2, 1 ), 938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MPPEM */ PACK( 0, 1 ), 939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MPS */ PACK( 0, 1 ), 940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FlipON */ PACK( 0, 0 ), 941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FlipOFF */ PACK( 0, 0 ), 942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DEBUG */ PACK( 1, 0 ), 943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* LT */ PACK( 2, 1 ), 945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* LTEQ */ PACK( 2, 1 ), 946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GT */ PACK( 2, 1 ), 947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GTEQ */ PACK( 2, 1 ), 948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* EQ */ PACK( 2, 1 ), 949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NEQ */ PACK( 2, 1 ), 950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ODD */ PACK( 1, 1 ), 951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* EVEN */ PACK( 1, 1 ), 952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IF */ PACK( 1, 0 ), 953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* EIF */ PACK( 0, 0 ), 954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* AND */ PACK( 2, 1 ), 955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* OR */ PACK( 2, 1 ), 956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NOT */ PACK( 1, 1 ), 957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DeltaP1 */ PACK( 1, 0 ), 958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SDB */ PACK( 1, 0 ), 959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SDS */ PACK( 1, 0 ), 960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ADD */ PACK( 2, 1 ), 962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SUB */ PACK( 2, 1 ), 963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DIV */ PACK( 2, 1 ), 964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MUL */ PACK( 2, 1 ), 965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ABS */ PACK( 1, 1 ), 966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NEG */ PACK( 1, 1 ), 967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FLOOR */ PACK( 1, 1 ), 968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CEILING */ PACK( 1, 1 ), 969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROUND[0] */ PACK( 1, 1 ), 970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROUND[1] */ PACK( 1, 1 ), 971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROUND[2] */ PACK( 1, 1 ), 972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROUND[3] */ PACK( 1, 1 ), 973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NROUND[0] */ PACK( 1, 1 ), 974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NROUND[1] */ PACK( 1, 1 ), 975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NROUND[2] */ PACK( 1, 1 ), 976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NROUND[3] */ PACK( 1, 1 ), 977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* WCvtF */ PACK( 2, 0 ), 979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DeltaP2 */ PACK( 1, 0 ), 980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DeltaP3 */ PACK( 1, 0 ), 981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DeltaCn[0] */ PACK( 1, 0 ), 982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DeltaCn[1] */ PACK( 1, 0 ), 983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DeltaCn[2] */ PACK( 1, 0 ), 984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SROUND */ PACK( 1, 0 ), 985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* S45Round */ PACK( 1, 0 ), 986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* JROT */ PACK( 2, 0 ), 987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* JROF */ PACK( 2, 0 ), 988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROFF */ PACK( 0, 0 ), 989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$7B */ PACK( 0, 0 ), 990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RUTG */ PACK( 0, 0 ), 991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RDTG */ PACK( 0, 0 ), 992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SANGW */ PACK( 1, 0 ), 993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* AA */ PACK( 1, 0 ), 994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FlipPT */ PACK( 0, 0 ), 996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FlipRgON */ PACK( 2, 0 ), 997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FlipRgOFF */ PACK( 2, 0 ), 998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$83 */ PACK( 0, 0 ), 999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$84 */ PACK( 0, 0 ), 1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ScanCTRL */ PACK( 1, 0 ), 1001aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* SDPVTL[0] */ PACK( 2, 0 ), 1002aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* SDPVTL[1] */ PACK( 2, 0 ), 1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GetINFO */ PACK( 1, 1 ), 1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IDEF */ PACK( 1, 0 ), 1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROLL */ PACK( 3, 3 ), 1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MAX */ PACK( 2, 1 ), 1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIN */ PACK( 2, 1 ), 1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ScanTYPE */ PACK( 1, 0 ), 1009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* InstCTRL */ PACK( 2, 0 ), 1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$8F */ PACK( 0, 0 ), 1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$90 */ PACK( 0, 0 ), 1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$91 */ PACK( 0, 0 ), 1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$92 */ PACK( 0, 0 ), 1015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$93 */ PACK( 0, 0 ), 1016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$94 */ PACK( 0, 0 ), 1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$95 */ PACK( 0, 0 ), 1018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$96 */ PACK( 0, 0 ), 1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$97 */ PACK( 0, 0 ), 1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$98 */ PACK( 0, 0 ), 1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$99 */ PACK( 0, 0 ), 1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$9A */ PACK( 0, 0 ), 1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$9B */ PACK( 0, 0 ), 1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$9C */ PACK( 0, 0 ), 1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$9D */ PACK( 0, 0 ), 1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$9E */ PACK( 0, 0 ), 1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$9F */ PACK( 0, 0 ), 1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$A0 */ PACK( 0, 0 ), 1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$A1 */ PACK( 0, 0 ), 1031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$A2 */ PACK( 0, 0 ), 1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$A3 */ PACK( 0, 0 ), 1033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$A4 */ PACK( 0, 0 ), 1034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$A5 */ PACK( 0, 0 ), 1035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$A6 */ PACK( 0, 0 ), 1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$A7 */ PACK( 0, 0 ), 1037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$A8 */ PACK( 0, 0 ), 1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$A9 */ PACK( 0, 0 ), 1039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$AA */ PACK( 0, 0 ), 1040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$AB */ PACK( 0, 0 ), 1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$AC */ PACK( 0, 0 ), 1042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$AD */ PACK( 0, 0 ), 1043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$AE */ PACK( 0, 0 ), 1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_$AF */ PACK( 0, 0 ), 1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[0] */ PACK( 0, 1 ), 1047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[1] */ PACK( 0, 2 ), 1048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[2] */ PACK( 0, 3 ), 1049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[3] */ PACK( 0, 4 ), 1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[4] */ PACK( 0, 5 ), 1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[5] */ PACK( 0, 6 ), 1052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[6] */ PACK( 0, 7 ), 1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[7] */ PACK( 0, 8 ), 1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[0] */ PACK( 0, 1 ), 1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[1] */ PACK( 0, 2 ), 1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[2] */ PACK( 0, 3 ), 1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[3] */ PACK( 0, 4 ), 1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[4] */ PACK( 0, 5 ), 1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[5] */ PACK( 0, 6 ), 1060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[6] */ PACK( 0, 7 ), 1061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[7] */ PACK( 0, 8 ), 1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[00] */ PACK( 1, 0 ), 1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[01] */ PACK( 1, 0 ), 1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[02] */ PACK( 1, 0 ), 1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[03] */ PACK( 1, 0 ), 1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[04] */ PACK( 1, 0 ), 1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[05] */ PACK( 1, 0 ), 1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[06] */ PACK( 1, 0 ), 1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[07] */ PACK( 1, 0 ), 1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[08] */ PACK( 1, 0 ), 1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[09] */ PACK( 1, 0 ), 1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[10] */ PACK( 1, 0 ), 1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[11] */ PACK( 1, 0 ), 1075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[12] */ PACK( 1, 0 ), 1076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[13] */ PACK( 1, 0 ), 1077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[14] */ PACK( 1, 0 ), 1078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[15] */ PACK( 1, 0 ), 1079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[16] */ PACK( 1, 0 ), 1081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[17] */ PACK( 1, 0 ), 1082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[18] */ PACK( 1, 0 ), 1083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[19] */ PACK( 1, 0 ), 1084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[20] */ PACK( 1, 0 ), 1085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[21] */ PACK( 1, 0 ), 1086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[22] */ PACK( 1, 0 ), 1087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[23] */ PACK( 1, 0 ), 1088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[24] */ PACK( 1, 0 ), 1089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[25] */ PACK( 1, 0 ), 1090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[26] */ PACK( 1, 0 ), 1091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[27] */ PACK( 1, 0 ), 1092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[28] */ PACK( 1, 0 ), 1093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[29] */ PACK( 1, 0 ), 1094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[30] */ PACK( 1, 0 ), 1095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[31] */ PACK( 1, 0 ), 1096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[00] */ PACK( 2, 0 ), 1098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[01] */ PACK( 2, 0 ), 1099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[02] */ PACK( 2, 0 ), 1100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[03] */ PACK( 2, 0 ), 1101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[04] */ PACK( 2, 0 ), 1102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[05] */ PACK( 2, 0 ), 1103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[06] */ PACK( 2, 0 ), 1104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[07] */ PACK( 2, 0 ), 1105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[08] */ PACK( 2, 0 ), 1106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[09] */ PACK( 2, 0 ), 1107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[10] */ PACK( 2, 0 ), 1108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[11] */ PACK( 2, 0 ), 1109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[12] */ PACK( 2, 0 ), 1110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[13] */ PACK( 2, 0 ), 1111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[14] */ PACK( 2, 0 ), 1112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[15] */ PACK( 2, 0 ), 1113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[16] */ PACK( 2, 0 ), 1115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[17] */ PACK( 2, 0 ), 1116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[18] */ PACK( 2, 0 ), 1117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[19] */ PACK( 2, 0 ), 1118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[20] */ PACK( 2, 0 ), 1119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[21] */ PACK( 2, 0 ), 1120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[22] */ PACK( 2, 0 ), 1121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[23] */ PACK( 2, 0 ), 1122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[24] */ PACK( 2, 0 ), 1123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[25] */ PACK( 2, 0 ), 1124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[26] */ PACK( 2, 0 ), 1125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[27] */ PACK( 2, 0 ), 1126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[28] */ PACK( 2, 0 ), 1127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[29] */ PACK( 2, 0 ), 1128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[30] */ PACK( 2, 0 ), 1129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[31] */ PACK( 2, 0 ) 1130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project }; 1131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1133aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#ifdef FT_DEBUG_LEVEL_TRACE 1134aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1135aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich static 1136aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich const char* const opcode_name[256] = 1137aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 1138aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SVTCA y", 1139aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SVTCA x", 1140aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SPvTCA y", 1141aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SPvTCA x", 1142aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SFvTCA y", 1143aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SFvTCA x", 1144aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SPvTL ||", 1145aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SPvTL +", 1146aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SFvTL ||", 1147aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SFvTL +", 1148aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SPvFS", 1149aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SFvFS", 1150aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "GPV", 1151aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "GFV", 1152aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SFvTPv", 1153aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ISECT", 1154aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1155aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SRP0", 1156aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SRP1", 1157aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SRP2", 1158aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SZP0", 1159aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SZP1", 1160aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SZP2", 1161aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SZPS", 1162aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SLOOP", 1163aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "RTG", 1164aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "RTHG", 1165aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SMD", 1166aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ELSE", 1167aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "JMPR", 1168aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SCvTCi", 1169aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SSwCi", 1170aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SSW", 1171aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1172aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "DUP", 1173aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "POP", 1174aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "CLEAR", 1175aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SWAP", 1176aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "DEPTH", 1177aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "CINDEX", 1178aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MINDEX", 1179aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "AlignPTS", 1180aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$28", 1181aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "UTP", 1182aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "LOOPCALL", 1183aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "CALL", 1184aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "FDEF", 1185aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ENDF", 1186aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDAP[0]", 1187aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDAP[1]", 1188aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1189aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "IUP[0]", 1190aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "IUP[1]", 1191aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SHP[0]", 1192aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SHP[1]", 1193aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SHC[0]", 1194aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SHC[1]", 1195aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SHZ[0]", 1196aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SHZ[1]", 1197aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SHPIX", 1198aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "IP", 1199aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MSIRP[0]", 1200aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MSIRP[1]", 1201aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "AlignRP", 1202aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "RTDG", 1203aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIAP[0]", 1204aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIAP[1]", 1205aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1206aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "NPushB", 1207aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "NPushW", 1208aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "WS", 1209aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "RS", 1210aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "WCvtP", 1211aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "RCvt", 1212aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "GC[0]", 1213aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "GC[1]", 1214aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SCFS", 1215aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MD[0]", 1216aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MD[1]", 1217aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MPPEM", 1218aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MPS", 1219aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "FlipON", 1220aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "FlipOFF", 1221aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "DEBUG", 1222aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1223aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "LT", 1224aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "LTEQ", 1225aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "GT", 1226aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "GTEQ", 1227aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "EQ", 1228aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "NEQ", 1229aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ODD", 1230aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "EVEN", 1231aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "IF", 1232aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "EIF", 1233aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "AND", 1234aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "OR", 1235aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "NOT", 1236aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "DeltaP1", 1237aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SDB", 1238aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SDS", 1239aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1240aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ADD", 1241aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SUB", 1242aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "DIV", 1243aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MUL", 1244aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ABS", 1245aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "NEG", 1246aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "FLOOR", 1247aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "CEILING", 1248aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ROUND[0]", 1249aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ROUND[1]", 1250aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ROUND[2]", 1251aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ROUND[3]", 1252aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "NROUND[0]", 1253aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "NROUND[1]", 1254aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "NROUND[2]", 1255aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "NROUND[3]", 1256aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1257aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "WCvtF", 1258aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "DeltaP2", 1259aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "DeltaP3", 1260aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "DeltaCn[0]", 1261aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "DeltaCn[1]", 1262aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "DeltaCn[2]", 1263aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SROUND", 1264aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "S45Round", 1265aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "JROT", 1266aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "JROF", 1267aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ROFF", 1268aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$7B", 1269aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "RUTG", 1270aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "RDTG", 1271aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SANGW", 1272aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "AA", 1273aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1274aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "FlipPT", 1275aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "FlipRgON", 1276aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "FlipRgOFF", 1277aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$83", 1278aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$84", 1279aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ScanCTRL", 1280aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SDVPTL[0]", 1281aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "SDVPTL[1]", 1282aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "GetINFO", 1283aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "IDEF", 1284aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ROLL", 1285aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MAX", 1286aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIN", 1287aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "ScanTYPE", 1288aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "InstCTRL", 1289aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$8F", 1290aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1291aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$90", 1292aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$91", 1293aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$92", 1294aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$93", 1295aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$94", 1296aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$95", 1297aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$96", 1298aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$97", 1299aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$98", 1300aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$99", 1301aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$9A", 1302aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$9B", 1303aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$9C", 1304aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$9D", 1305aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$9E", 1306aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$9F", 1307aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1308aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$A0", 1309aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$A1", 1310aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$A2", 1311aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$A3", 1312aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$A4", 1313aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$A5", 1314aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$A6", 1315aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$A7", 1316aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$A8", 1317aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$A9", 1318aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$AA", 1319aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$AB", 1320aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$AC", 1321aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$AD", 1322aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$AE", 1323aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "INS_$AF", 1324aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1325aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushB[0]", 1326aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushB[1]", 1327aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushB[2]", 1328aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushB[3]", 1329aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushB[4]", 1330aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushB[5]", 1331aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushB[6]", 1332aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushB[7]", 1333aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushW[0]", 1334aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushW[1]", 1335aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushW[2]", 1336aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushW[3]", 1337aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushW[4]", 1338aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushW[5]", 1339aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushW[6]", 1340aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "PushW[7]", 1341aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1342aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[00]", 1343aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[01]", 1344aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[02]", 1345aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[03]", 1346aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[04]", 1347aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[05]", 1348aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[06]", 1349aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[07]", 1350aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[08]", 1351aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[09]", 1352aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[10]", 1353aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[11]", 1354aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[12]", 1355aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[13]", 1356aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[14]", 1357aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[15]", 1358aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1359aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[16]", 1360aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[17]", 1361aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[18]", 1362aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[19]", 1363aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[20]", 1364aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[21]", 1365aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[22]", 1366aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[23]", 1367aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[24]", 1368aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[25]", 1369aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[26]", 1370aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[27]", 1371aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[28]", 1372aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[29]", 1373aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[30]", 1374aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MDRP[31]", 1375aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1376aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[00]", 1377aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[01]", 1378aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[02]", 1379aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[03]", 1380aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[04]", 1381aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[05]", 1382aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[06]", 1383aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[07]", 1384aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[08]", 1385aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[09]", 1386aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[10]", 1387aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[11]", 1388aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[12]", 1389aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[13]", 1390aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[14]", 1391aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[15]", 1392aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1393aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[16]", 1394aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[17]", 1395aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[18]", 1396aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[19]", 1397aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[20]", 1398aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[21]", 1399aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[22]", 1400aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[23]", 1401aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[24]", 1402aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[25]", 1403aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[26]", 1404aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[27]", 1405aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[28]", 1406aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[29]", 1407aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[30]", 1408aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich "MIRP[31]" 1409aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich }; 1410aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1411aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#endif /* FT_DEBUG_LEVEL_TRACE */ 1412aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1413aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 1414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static 1415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Char opcode_length[256] = 1416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project -1,-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2, 3, 4, 5, 6, 7, 8, 9, 3, 5, 7, 9, 11,13,15,17, 1431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 1436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project }; 1437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef PACK 1439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 1 1441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Int32 1443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_MulFix14( FT_Int32 a, 1444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int b ) 1445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 sign; 1447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 ah, al, mid, lo, hi; 1448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project sign = a ^ b; 1451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( a < 0 ) 1453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project a = -a; 1454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( b < 0 ) 1455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project b = -b; 1456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU ); 1458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project al = (FT_UInt32)( a & 0xFFFFU ); 1459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo = al * b; 1461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mid = ah * b; 1462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi = mid >> 16; 1463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mid = ( mid << 16 ) + ( 1 << 13 ); /* rounding */ 1464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo += mid; 1465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( lo < mid ) 1466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi += 1; 1467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mid = ( lo >> 14 ) | ( hi << 18 ); 1469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid; 1471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 1474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1475727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* compute (a*b)/2^14 with maximum accuracy and rounding */ 1476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Int32 1477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_MulFix14( FT_Int32 a, 1478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int b ) 1479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 m, s, hi; 1481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 l, lo; 1482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compute ax*bx as 64-bit value */ 1485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project l = (FT_UInt32)( ( a & 0xFFFFU ) * b ); 1486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project m = ( a >> 16 ) * b; 1487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1488727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease lo = l + ( (FT_UInt32)m << 16 ); 1489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l ); 1490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* divide the result by 2^14 with rounding */ 1492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s = hi >> 31; 1493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project l = lo + (FT_UInt32)s; 1494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi += s + ( l < lo ); 1495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo = l; 1496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project l = lo + 0x2000U; 1498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi += l < lo; 1499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1500727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) ); 1501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1505727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */ 1506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Int32 1507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DotFix14( FT_Int32 ax, 1508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 ay, 1509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int bx, 1510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int by ) 1511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int32 m, s, hi1, hi2, hi; 1513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt32 l, lo1, lo2, lo; 1514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compute ax*bx as 64-bit value */ 1517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx ); 1518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project m = ( ax >> 16 ) * bx; 1519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1520727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease lo1 = l + ( (FT_UInt32)m << 16 ); 1521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l ); 1522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compute ay*by as 64-bit value */ 1524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project l = (FT_UInt32)( ( ay & 0xFFFFU ) * by ); 1525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project m = ( ay >> 16 ) * by; 1526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1527727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease lo2 = l + ( (FT_UInt32)m << 16 ); 1528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l ); 1529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* add them */ 1531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo = lo1 + lo2; 1532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi = hi1 + hi2 + ( lo < lo1 ); 1533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* divide the result by 2^14 with rounding */ 1535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project s = hi >> 31; 1536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project l = lo + (FT_UInt32)s; 1537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi += s + ( l < lo ); 1538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project lo = l; 1539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project l = lo + 0x2000U; 1541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hi += ( l < lo ); 1542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1543727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) ); 1544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Current_Ratio */ 1551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Returns the current aspect ratio scaling factor depending on the */ 1554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* projection vector's state and device resolutions. */ 1555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 1557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The aspect ratio in 16.16 format, always <= 1.0 . */ 1558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Long 1560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Current_Ratio( EXEC_OP ) 1561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !CUR.tt_metrics.ratio ) 1563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 1565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.face->unpatented_hinting ) 1566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.both_x_axis ) 1568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio; 1569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio; 1571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.projVector.y == 0 ) 1576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio; 1577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( CUR.GS.projVector.x == 0 ) 1579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio; 1580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1583727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_F26Dot6 x, y; 1584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1586727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease x = TT_MulFix14( CUR.tt_metrics.x_ratio, 1587727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.projVector.x ); 1588727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease y = TT_MulFix14( CUR.tt_metrics.y_ratio, 1589727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.projVector.y ); 1590727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.tt_metrics.ratio = FT_Hypot( x, y ); 1591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CUR.tt_metrics.ratio; 1595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Long 1599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Current_Ppem( EXEC_OP ) 1600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1601727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_MulFix( CUR.tt_metrics.ppem, CURRENT_Ratio() ); 1602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Functions related to the control value table (CVT). */ 1608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_F26Dot6 ) 1613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Read_CVT( EXEC_OP_ FT_ULong idx ) 1614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CUR.cvt[idx]; 1616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( FT_F26Dot6 ) 1620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Read_CVT_Stretched( EXEC_OP_ FT_ULong idx ) 1621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1622727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_MulFix( CUR.cvt[idx], CURRENT_Ratio() ); 1623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 1627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Write_CVT( EXEC_OP_ FT_ULong idx, 1628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 value ) 1629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.cvt[idx] = value; 1631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 1635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Write_CVT_Stretched( EXEC_OP_ FT_ULong idx, 1636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 value ) 1637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() ); 1639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 1643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Move_CVT( EXEC_OP_ FT_ULong idx, 1644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 value ) 1645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.cvt[idx] += value; 1647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_CALLBACK_DEF( void ) 1651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Move_CVT_Stretched( EXEC_OP_ FT_ULong idx, 1652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 value ) 1653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() ); 1655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GetShortIns */ 1662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Returns a short integer taken from the instruction stream at */ 1665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* address IP. */ 1666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 1668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Short read at code[IP]. */ 1669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Note> */ 1671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This one could become a macro. */ 1672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Short 1674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GetShortIns( EXEC_OP ) 1675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Reading a byte stream so there is no endianess (DaveP) */ 1677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.IP += 2; 1678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) + 1679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.code[CUR.IP - 1] ); 1680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Ins_Goto_CodeRange */ 1687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Goes to a certain code range in the instruction stream. */ 1690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* aRange :: The index of the code range. */ 1693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* aIP :: The new IP address in the code range. */ 1695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 1697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SUCCESS or FAILURE. */ 1698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Bool 1700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_Goto_CodeRange( EXEC_OP_ FT_Int aRange, 1701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong aIP ) 1702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_CodeRange* range; 1704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( aRange < 1 || aRange > 3 ) 1707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1708727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Bad_Argument ); 1709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FAILURE; 1710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project range = &CUR.codeRangeTable[aRange - 1]; 1713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( range->base == NULL ) /* invalid coderange */ 1715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1716727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_CodeRange ); 1717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FAILURE; 1718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NOTE: Because the last instruction of a program may be a CALL */ 1721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* which will return to the first byte *after* the code */ 172241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* range, we test for aIP <= Size, instead of aIP < Size. */ 1723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( aIP > range->size ) 1725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1726727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Code_Overflow ); 1727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FAILURE; 1728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.code = range->base; 1731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.codeSize = range->size; 1732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.IP = aIP; 1733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.curRange = aRange; 1734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return SUCCESS; 1736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Direct_Move */ 1743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Moves a point by a given distance along the freedom vector. The */ 1746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* point will be `touched'. */ 1747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* point :: The index of the point to move. */ 1750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* distance :: The distance to apply. */ 1752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 1754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* zone :: The affected glyph zone. */ 1755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 1757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Direct_Move( EXEC_OP_ TT_GlyphZone zone, 1758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point, 1759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 distance ) 1760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 v; 1762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 1765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ASSERT( !CUR.face->unpatented_hinting ); 1766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v = CUR.GS.freeVector.x; 1769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( v != 0 ) 1771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1772727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 1773727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( !SUBPIXEL_HINTING || 1774727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( !CUR.ignore_x_mode || 1775727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) ) 1776727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 1777727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease zone->cur[point].x += FT_MulDiv( distance, v, CUR.F_dot_P ); 1778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; 1780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v = CUR.GS.freeVector.y; 1783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( v != 0 ) 1785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1786727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease zone->cur[point].y += FT_MulDiv( distance, v, CUR.F_dot_P ); 1787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; 1789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Direct_Move_Orig */ 1797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Moves the *original* position of a point by a given distance along */ 1800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the freedom vector. Obviously, the point will not be `touched'. */ 1801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* point :: The index of the point to move. */ 1804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* distance :: The distance to apply. */ 1806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <InOut> */ 1808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* zone :: The affected glyph zone. */ 1809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 1811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Direct_Move_Orig( EXEC_OP_ TT_GlyphZone zone, 1812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point, 1813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 distance ) 1814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 v; 1816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 1819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ASSERT( !CUR.face->unpatented_hinting ); 1820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v = CUR.GS.freeVector.x; 1823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( v != 0 ) 1825727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease zone->org[point].x += FT_MulDiv( distance, v, CUR.F_dot_P ); 1826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project v = CUR.GS.freeVector.y; 1828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( v != 0 ) 1830727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease zone->org[point].y += FT_MulDiv( distance, v, CUR.F_dot_P ); 1831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Special versions of Direct_Move() */ 1837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The following versions are used whenever both vectors are both */ 1839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ 1840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 1845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Direct_Move_X( EXEC_OP_ TT_GlyphZone zone, 1846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point, 1847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 distance ) 1848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 1850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1851727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 1852727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( !SUBPIXEL_HINTING || 1853727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease !CUR.ignore_x_mode ) 1854727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 1855727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease zone->cur[point].x += distance; 1856727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 1857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; 1858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 1862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Direct_Move_Y( EXEC_OP_ TT_GlyphZone zone, 1863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point, 1864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 distance ) 1865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 1867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->cur[point].y += distance; 1869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; 1870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Special versions of Direct_Move_Orig() */ 1876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The following versions are used whenever both vectors are both */ 1878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ 1879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 1884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone zone, 1885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point, 1886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 distance ) 1887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 1889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->org[point].x += distance; 1891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 1895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone zone, 1896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point, 1897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 distance ) 1898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 1900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zone->org[point].y += distance; 1902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Round_None */ 1909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Does not round, but adds engine compensation. */ 1912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* distance :: The distance (not) to round. */ 1915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compensation :: The engine compensation. */ 1917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 1919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The compensated distance. */ 1920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Note> */ 1922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The TrueType specification says very few about the relationship */ 1923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* between rounding and engine compensation. However, it seems from */ 1924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the description of super round that we should add the compensation */ 1925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* before rounding. */ 1926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_F26Dot6 1928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Round_None( EXEC_OP_ FT_F26Dot6 distance, 1929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 compensation ) 1930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 val; 1932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 1934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance >= 0 ) 1937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = distance + compensation; 1939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance && val < 0 ) 1940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 1941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1942aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich else 1943aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { 1944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = distance - compensation; 1945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( val > 0 ) 1946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 1947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return val; 1949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Round_To_Grid */ 1956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 1958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rounds value to grid after adding engine compensation. */ 1959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 1961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* distance :: The distance to round. */ 1962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compensation :: The engine compensation. */ 1964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 1966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rounded distance. */ 1967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_F26Dot6 1969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Round_To_Grid( EXEC_OP_ FT_F26Dot6 distance, 1970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 compensation ) 1971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 val; 1973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 1975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance >= 0 ) 1978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = distance + compensation + 32; 1980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance && val > 0 ) 1981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val &= ~63; 1982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 1984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 1986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = -FT_PIX_ROUND( compensation - distance ); 1988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( val > 0 ) 1989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 1990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return val; 1993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 1998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 1999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Round_To_Half_Grid */ 2000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rounds value to half grid after adding engine compensation. */ 2003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* distance :: The distance to round. */ 2006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compensation :: The engine compensation. */ 2008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 2010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rounded distance. */ 2011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_F26Dot6 2013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6 distance, 2014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 compensation ) 2015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 val; 2017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 2019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance >= 0 ) 2022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = FT_PIX_FLOOR( distance + compensation ) + 32; 2024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance && val < 0 ) 2025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 2026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = -( FT_PIX_FLOOR( compensation - distance ) + 32 ); 2030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( val > 0 ) 2031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 2032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return val; 2035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Round_Down_To_Grid */ 2042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rounds value down to grid after adding engine compensation. */ 2045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* distance :: The distance to round. */ 2048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compensation :: The engine compensation. */ 2050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 2052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rounded distance. */ 2053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_F26Dot6 2055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6 distance, 2056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 compensation ) 2057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 val; 2059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 2061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance >= 0 ) 2064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = distance + compensation; 2066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance && val > 0 ) 2067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val &= ~63; 2068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 2070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = -( ( compensation - distance ) & -64 ); 2074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( val > 0 ) 2075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 2076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return val; 2079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Round_Up_To_Grid */ 2086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rounds value up to grid after adding engine compensation. */ 2089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* distance :: The distance to round. */ 2092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compensation :: The engine compensation. */ 2094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 2096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rounded distance. */ 2097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_F26Dot6 2099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6 distance, 2100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 compensation ) 2101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 val; 2103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 2105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance >= 0 ) 2108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = distance + compensation + 63; 2110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance && val > 0 ) 2111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val &= ~63; 2112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 2114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2117727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease val = -FT_PIX_CEIL( compensation - distance ); 2118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( val > 0 ) 2119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 2120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return val; 2123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Round_To_Double_Grid */ 2130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rounds value to double grid after adding engine compensation. */ 2133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* distance :: The distance to round. */ 2136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compensation :: The engine compensation. */ 2138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 2140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rounded distance. */ 2141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_F26Dot6 2143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6 distance, 2144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 compensation ) 2145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 val; 2147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 2149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance >= 0 ) 2152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = distance + compensation + 16; 2154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance && val > 0 ) 2155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val &= ~31; 2156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 2158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = -FT_PAD_ROUND( compensation - distance, 32 ); 2162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( val > 0 ) 2163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 2164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return val; 2167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Round_Super */ 2174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Super-rounds value to grid after adding engine compensation. */ 2177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* distance :: The distance to round. */ 2180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compensation :: The engine compensation. */ 2182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 2184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rounded distance. */ 2185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Note> */ 2187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The TrueType specification says very few about the relationship */ 2188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* between rounding and engine compensation. However, it seems from */ 2189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the description of super round that we should add the compensation */ 2190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* before rounding. */ 2191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_F26Dot6 2193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Round_Super( EXEC_OP_ FT_F26Dot6 distance, 2194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 compensation ) 2195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 val; 2197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance >= 0 ) 2200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = ( distance - CUR.phase + CUR.threshold + compensation ) & 2202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project -CUR.period; 2203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance && val < 0 ) 2204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 2205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val += CUR.phase; 2206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = -( ( CUR.threshold - CUR.phase - distance + compensation ) & 2210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project -CUR.period ); 2211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( val > 0 ) 2212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 2213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val -= CUR.phase; 2214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return val; 2217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Round_Super_45 */ 2224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Super-rounds value to grid after adding engine compensation. */ 2227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* distance :: The distance to round. */ 2230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compensation :: The engine compensation. */ 2232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 2234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Rounded distance. */ 2235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Note> */ 2237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* There is a separate function for Round_Super_45() as we may need */ 2238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* greater precision. */ 2239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_F26Dot6 2241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Round_Super_45( EXEC_OP_ FT_F26Dot6 distance, 2242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 compensation ) 2243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 val; 2245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance >= 0 ) 2248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = ( ( distance - CUR.phase + CUR.threshold + compensation ) / 2250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.period ) * CUR.period; 2251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( distance && val < 0 ) 2252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 2253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val += CUR.phase; 2254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) / 2258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.period ) * CUR.period ); 2259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( val > 0 ) 2260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = 0; 2261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val -= CUR.phase; 2262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return val; 2265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Compute_Round */ 2272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Sets the rounding mode. */ 2275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* round_mode :: The rounding mode to be used. */ 2278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 2280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Compute_Round( EXEC_OP_ FT_Byte round_mode ) 2281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( round_mode ) 2283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TT_Round_Off: 2285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_None; 2286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TT_Round_To_Grid: 2289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_To_Grid; 2290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TT_Round_Up_To_Grid: 2293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_Up_To_Grid; 2294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TT_Round_Down_To_Grid: 2297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_Down_To_Grid; 2298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TT_Round_To_Half_Grid: 2301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_To_Half_Grid; 2302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TT_Round_To_Double_Grid: 2305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_To_Double_Grid; 2306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TT_Round_Super: 2309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_Super; 2310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case TT_Round_Super_45: 2313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_Super_45; 2314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SetSuperRound */ 2323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Sets Super Round parameters. */ 2326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2328727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* GridPeriod :: The grid period. */ 2329727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 2330727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* selector :: The SROUND opcode. */ 2331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 2333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SetSuperRound( EXEC_OP_ FT_F26Dot6 GridPeriod, 2334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long selector ) 2335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( (FT_Int)( selector & 0xC0 ) ) 2337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0: 2339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.period = GridPeriod / 2; 2340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x40: 2343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.period = GridPeriod; 2344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x80: 2347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.period = GridPeriod * 2; 2348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This opcode is reserved, but... */ 2351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0xC0: 2353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.period = GridPeriod; 2354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( (FT_Int)( selector & 0x30 ) ) 2358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0: 2360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.phase = 0; 2361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x10: 2364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.phase = CUR.period / 4; 2365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x20: 2368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.phase = CUR.period / 2; 2369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x30: 2372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.phase = CUR.period * 3 / 4; 2373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 2374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( selector & 0x0F ) == 0 ) 2377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.threshold = CUR.period - 1; 2378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8; 2380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.period /= 256; 2382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.phase /= 256; 2383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.threshold /= 256; 2384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Project */ 2391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Computes the projection of vector given by (v2-v1) along the */ 2394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* current projection vector. */ 2395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* v1 :: First input vector. */ 2398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* v2 :: Second input vector. */ 2399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 2401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The distance in F26dot6 format. */ 2402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_F26Dot6 2404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Project( EXEC_OP_ FT_Pos dx, 2405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos dy ) 2406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 2408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ASSERT( !CUR.face->unpatented_hinting ); 2409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 2410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2411295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy, 2412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.projVector.x, 2413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.projVector.y ); 2414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Dual_Project */ 2421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Computes the projection of the vector given by (v2-v1) along the */ 2424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* current dual vector. */ 2425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* v1 :: First input vector. */ 2428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* v2 :: Second input vector. */ 2429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 2431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The distance in F26dot6 format. */ 2432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_F26Dot6 2434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Dual_Project( EXEC_OP_ FT_Pos dx, 2435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos dy ) 2436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2437295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy, 2438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.dualVector.x, 2439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.dualVector.y ); 2440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Project_x */ 2447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Computes the projection of the vector given by (v2-v1) along the */ 2450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* horizontal axis. */ 2451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* v1 :: First input vector. */ 2454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* v2 :: Second input vector. */ 2455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 2457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The distance in F26dot6 format. */ 2458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_F26Dot6 2460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Project_x( EXEC_OP_ FT_Pos dx, 2461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos dy ) 2462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 2464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( dy ); 2465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return dx; 2467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Project_y */ 2474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Computes the projection of the vector given by (v2-v1) along the */ 2477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* vertical axis. */ 2478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* v1 :: First input vector. */ 2481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* v2 :: Second input vector. */ 2482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 2484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The distance in F26dot6 format. */ 2485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_F26Dot6 2487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Project_y( EXEC_OP_ FT_Pos dx, 2488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos dy ) 2489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 2491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED( dx ); 2492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return dy; 2494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Compute_Funcs */ 2501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Computes the projection and movement function pointers according */ 2504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* to the current graphics state. */ 2505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 2507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Compute_Funcs( EXEC_OP ) 2508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 2510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.face->unpatented_hinting ) 2511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* If both vectors point rightwards along the x axis, set */ 2513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* `both-x-axis' true, otherwise set it false. The x values only */ 2514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* need be tested because the vector has been normalised to a unit */ 2515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* vector of length 0x4000 = unity. */ 2516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 && 2517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.freeVector.x == 0x4000 ); 2518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Throw away projection and freedom vector information */ 2520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* because the patents don't allow them to be stored. */ 2521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The relevant US Patents are 5155805 and 5325479. */ 2522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.projVector.x = 0; 2523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.projVector.y = 0; 2524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.freeVector.x = 0; 2525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.freeVector.y = 0; 2526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.both_x_axis ) 2528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_project = Project_x; 2530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move = Direct_Move_X; 2531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move_orig = Direct_Move_Orig_X; 2532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_project = Project_y; 2536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move = Direct_Move_Y; 2537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move_orig = Direct_Move_Orig_Y; 2538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.dualVector.x == 0x4000 ) 2541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_dualproj = Project_x; 2542727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else if ( CUR.GS.dualVector.y == 0x4000 ) 2543727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.func_dualproj = Project_y; 2544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2545727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.func_dualproj = Dual_Project; 2546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Force recalculation of cached aspect ratio */ 2548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.ratio = 0; 2549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 2551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */ 2553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.freeVector.x == 0x4000 ) 2555727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.F_dot_P = CUR.GS.projVector.x; 2556727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else if ( CUR.GS.freeVector.y == 0x4000 ) 2557727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.F_dot_P = CUR.GS.projVector.y; 2558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2559727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.F_dot_P = ( (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x + 2560727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y ) >> 2561727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 14; 2562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.projVector.x == 0x4000 ) 2564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_project = (TT_Project_Func)Project_x; 2565727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else if ( CUR.GS.projVector.y == 0x4000 ) 2566727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.func_project = (TT_Project_Func)Project_y; 2567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2568727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.func_project = (TT_Project_Func)Project; 2569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.dualVector.x == 0x4000 ) 2571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_dualproj = (TT_Project_Func)Project_x; 2572727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else if ( CUR.GS.dualVector.y == 0x4000 ) 2573727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.func_dualproj = (TT_Project_Func)Project_y; 2574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 2575727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.func_dualproj = (TT_Project_Func)Dual_Project; 2576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move = (TT_Move_Func)Direct_Move; 2578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig; 2579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2580727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.F_dot_P == 0x4000L ) 2581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.freeVector.x == 0x4000 ) 2583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move = (TT_Move_Func)Direct_Move_X; 2585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X; 2586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2587727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else if ( CUR.GS.freeVector.y == 0x4000 ) 2588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2589727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.func_move = (TT_Move_Func)Direct_Move_Y; 2590727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y; 2591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* at small sizes, F_dot_P can become too small, resulting */ 2595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* in overflows and `spikes' in a number of glyphs like `w'. */ 2596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2597727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( FT_ABS( CUR.F_dot_P ) < 0x400L ) 2598727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.F_dot_P = 0x4000L; 2599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Disable cached aspect ratio */ 2601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.ratio = 0; 2602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Function> */ 2608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Normalize */ 2609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Description> */ 2611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Norms a vector. */ 2612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Input> */ 2614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Vx :: The horizontal input vector coordinate. */ 2615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Vy :: The vertical input vector coordinate. */ 2616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Output> */ 2618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* R :: The normed unit vector. */ 2619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Return> */ 2621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Returns FAILURE if a vector parameter is zero. */ 2622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* <Note> */ 2624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* In case Vx and Vy are both zero, Normalize() returns SUCCESS, and */ 2625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* R is undefined. */ 2626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Bool 2628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Normalize( EXEC_OP_ FT_F26Dot6 Vx, 2629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 Vy, 2630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UnitVector* R ) 2631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 W; 2633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 2635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2637727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( FT_ABS( Vx ) < 0x4000L && FT_ABS( Vy ) < 0x4000L ) 2638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2639727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( Vx == 0 && Vy == 0 ) 2640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: UNDOCUMENTED! It seems that it is possible to try */ 2642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* to normalize the vector (0,0). Return immediately. */ 2643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return SUCCESS; 2644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2646727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease Vx *= 0x4000; 2647727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease Vy *= 0x4000; 2648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2650727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease W = FT_Hypot( Vx, Vy ); 2651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2652727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease R->x = (FT_F2Dot14)TT_DivFix14( Vx, W ); 2653727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease R->y = (FT_F2Dot14)TT_DivFix14( Vy, W ); 2654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return SUCCESS; 2656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Here we start with the implementation of the various opcodes. */ 2662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 2664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Bool 2667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SxVTL( EXEC_OP_ FT_UShort aIdx1, 2668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort aIdx2, 2669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int aOpc, 2670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UnitVector* Vec ) 2671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long A, B, C; 2673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* p1; 2674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* p2; 2675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( aIdx1, CUR.zp2.n_points ) || 2678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( aIdx2, CUR.zp1.n_points ) ) 2679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 2681727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 2682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FAILURE; 2683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p1 = CUR.zp1.cur + aIdx2; 2686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p2 = CUR.zp2.cur + aIdx1; 2687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = p1->x - p2->x; 2689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = p1->y - p2->y; 2690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2691aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* If p1 == p2, SPVTL and SFVTL behave the same as */ 2692aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* SPVTCA[X] and SFVTCA[X], respectively. */ 2693aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* */ 2694aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Confirmed by Greg Hitchcock. */ 2695aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 2696aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( A == 0 && B == 0 ) 2697aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 2698aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner A = 0x4000; 2699aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner aOpc = 0; 2700aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 2701aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 2702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( aOpc & 1 ) != 0 ) 2703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 2704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C = B; /* counter clockwise rotation */ 2705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = A; 2706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = -C; 2707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NORMalize( A, B, Vec ); 2710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return SUCCESS; 2712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* When not using the big switch statements, the interpreter uses a */ 2716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* call table defined later below in this source. Each opcode must */ 2717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* thus have a corresponding function, even trivial ones. */ 2718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 2719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* They are all defined there. */ 2720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SVTCA \ 2722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 2723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short A, B; \ 2724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = (FT_Short)( CUR.opcode & 1 ) << 14; \ 2727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = A ^ (FT_Short)0x4000; \ 2728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.freeVector.x = A; \ 2730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.projVector.x = A; \ 2731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.dualVector.x = A; \ 2732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.freeVector.y = B; \ 2734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.projVector.y = B; \ 2735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.dualVector.y = B; \ 2736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project COMPUTE_Funcs(); \ 2738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SPVTCA \ 2742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 2743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short A, B; \ 2744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = (FT_Short)( CUR.opcode & 1 ) << 14; \ 2747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = A ^ (FT_Short)0x4000; \ 2748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.projVector.x = A; \ 2750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.dualVector.x = A; \ 2751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.projVector.y = B; \ 2753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.dualVector.y = B; \ 2754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GUESS_VECTOR( freeVector ); \ 2756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project COMPUTE_Funcs(); \ 2758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVTCA \ 2762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 2763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short A, B; \ 2764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = (FT_Short)( CUR.opcode & 1 ) << 14; \ 2767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = A ^ (FT_Short)0x4000; \ 2768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.freeVector.x = A; \ 2770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.freeVector.y = B; \ 2771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GUESS_VECTOR( projVector ); \ 2773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project COMPUTE_Funcs(); \ 2775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SPVTL \ 2779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( INS_SxVTL( (FT_UShort)args[1], \ 2780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_UShort)args[0], \ 2781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.opcode, \ 2782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &CUR.GS.projVector ) == SUCCESS ) \ 2783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 2784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.dualVector = CUR.GS.projVector; \ 2785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GUESS_VECTOR( freeVector ); \ 2786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project COMPUTE_Funcs(); \ 2787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVTL \ 2791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( INS_SxVTL( (FT_UShort)args[1], \ 2792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_UShort)args[0], \ 2793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.opcode, \ 2794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &CUR.GS.freeVector ) == SUCCESS ) \ 2795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 2796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GUESS_VECTOR( projVector ); \ 2797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project COMPUTE_Funcs(); \ 2798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVTPV \ 2802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GUESS_VECTOR( projVector ); \ 2803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.freeVector = CUR.GS.projVector; \ 2804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project COMPUTE_Funcs(); 2805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SPVFS \ 2808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 2809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short S; \ 2810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long X, Y; \ 2811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Only use low 16bits, then sign extend */ \ 2814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project S = (FT_Short)args[1]; \ 2815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Y = (FT_Long)S; \ 2816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project S = (FT_Short)args[0]; \ 2817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project X = (FT_Long)S; \ 2818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NORMalize( X, Y, &CUR.GS.projVector ); \ 2820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.dualVector = CUR.GS.projVector; \ 2822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GUESS_VECTOR( freeVector ); \ 2823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project COMPUTE_Funcs(); \ 2824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SFVFS \ 2828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 2829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short S; \ 2830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long X, Y; \ 2831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Only use low 16bits, then sign extend */ \ 2834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project S = (FT_Short)args[1]; \ 2835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Y = (FT_Long)S; \ 2836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project S = (FT_Short)args[0]; \ 2837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project X = S; \ 2838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 2839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NORMalize( X, Y, &CUR.GS.freeVector ); \ 2840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GUESS_VECTOR( projVector ); \ 2841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project COMPUTE_Funcs(); \ 2842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 2846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GPV \ 2847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.face->unpatented_hinting ) \ 2848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 2849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \ 2850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \ 2851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } \ 2852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else \ 2853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 2854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = CUR.GS.projVector.x; \ 2855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[1] = CUR.GS.projVector.y; \ 2856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 2858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GPV \ 2859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = CUR.GS.projVector.x; \ 2860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[1] = CUR.GS.projVector.y; 2861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 2862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 2865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GFV \ 2866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.face->unpatented_hinting ) \ 2867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 2868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \ 2869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \ 2870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } \ 2871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else \ 2872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 2873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = CUR.GS.freeVector.x; \ 2874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[1] = CUR.GS.freeVector.y; \ 2875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 2876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 2877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GFV \ 2878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = CUR.GS.freeVector.x; \ 2879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[1] = CUR.GS.freeVector.y; 2880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 2881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SRP0 \ 2884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp0 = (FT_UShort)args[0]; 2885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SRP1 \ 2888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp1 = (FT_UShort)args[0]; 2889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SRP2 \ 2892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp2 = (FT_UShort)args[0]; 2893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RTHG \ 2896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.round_state = TT_Round_To_Half_Grid; \ 2897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_To_Half_Grid; 2898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RTG \ 2901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.round_state = TT_Round_To_Grid; \ 2902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_To_Grid; 2903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RTDG \ 2906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.round_state = TT_Round_To_Double_Grid; \ 2907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_To_Double_Grid; 2908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RUTG \ 2911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.round_state = TT_Round_Up_To_Grid; \ 2912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_Up_To_Grid; 2913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RDTG \ 2916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.round_state = TT_Round_Down_To_Grid; \ 2917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_Down_To_Grid; 2918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ROFF \ 2921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.round_state = TT_Round_Off; \ 2922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_None; 2923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SROUND \ 2926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SET_SuperRound( 0x4000, args[0] ); \ 2927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.round_state = TT_Round_Super; \ 2928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_Super; 2929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_S45ROUND \ 2932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SET_SuperRound( 0x2D41, args[0] ); \ 2933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.round_state = TT_Round_Super_45; \ 2934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_round = (TT_Round_Func)Round_Super_45; 2935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2937727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_SLOOP \ 2938727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( args[0] < 0 ) \ 2939727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Bad_Argument ); \ 2940727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else \ 2941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.loop = args[0]; 2942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SMD \ 2945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.minimum_distance = args[0]; 2946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SCVTCI \ 2949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.control_value_cutin = (FT_F26Dot6)args[0]; 2950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SSWCI \ 2953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.single_width_cutin = (FT_F26Dot6)args[0]; 2954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2956727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_SSW \ 2957727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.single_width_value = FT_MulFix( args[0], \ 2958727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.tt_metrics.scale ); 2959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_FLIPON \ 2962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.auto_flip = TRUE; 2963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_FLIPOFF \ 2966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.auto_flip = FALSE; 2967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SDB \ 2970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.delta_base = (FT_Short)args[0]; 2971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SDS \ 2974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.delta_shift = (FT_Short)args[0]; 2975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MD /* nothing */ 2978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MPPEM \ 2981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = CURRENT_Ppem(); 2982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Note: The pointSize should be irrelevant in a given font program; */ 2985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* we thus decide to return only the ppem. */ 2986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0 2987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MPS \ 2989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = CUR.metrics.pointSize; 2990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 2992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MPS \ 2994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = CURRENT_Ppem(); 2995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* 0 */ 2997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 2999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DUP \ 3000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[1] = args[0]; 3001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_CLEAR \ 3004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top = 0; 3005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SWAP \ 3008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 3009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long L; \ 3010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 3011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 3012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = args[0]; \ 3013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = args[1]; \ 3014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[1] = L; \ 3015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DEPTH \ 3019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = CUR.top; 3020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3022727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_CINDEX \ 3023727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { \ 3024727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Long L; \ 3025727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease \ 3026727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease \ 3027727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease L = args[0]; \ 3028727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease \ 3029727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( L <= 0 || L > CUR.args ) \ 3030727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { \ 3031727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.pedantic_hinting ) \ 3032727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); \ 3033727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease args[0] = 0; \ 3034727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } \ 3035727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else \ 3036727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease args[0] = CUR.stack[CUR.args - L]; \ 3037aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 3038aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 3039aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 304041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#define DO_JROT \ 304141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( args[1] != 0 ) \ 304241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier { \ 304341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( args[0] == 0 && CUR.args == 0 ) \ 3044727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Bad_Argument ); \ 304541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.IP += args[0]; \ 304641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( CUR.IP < 0 || \ 304741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier ( CUR.callTop > 0 && \ 304841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) ) \ 3049727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Bad_Argument ); \ 305041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.step_ins = FALSE; \ 3051aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 3052aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 3053aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 305441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#define DO_JMPR \ 305541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( args[0] == 0 && CUR.args == 0 ) \ 3056727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Bad_Argument ); \ 305741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.IP += args[0]; \ 305841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( CUR.IP < 0 || \ 305941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier ( CUR.callTop > 0 && \ 306041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) ) \ 3061727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Bad_Argument ); \ 3062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.step_ins = FALSE; 3063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 306541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier#define DO_JROF \ 306641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( args[1] == 0 ) \ 306741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier { \ 306841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( args[0] == 0 && CUR.args == 0 ) \ 3069727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Bad_Argument ); \ 307041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.IP += args[0]; \ 307141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( CUR.IP < 0 || \ 307241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier ( CUR.callTop > 0 && \ 307341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) ) \ 3074727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Bad_Argument ); \ 307541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.step_ins = FALSE; \ 3076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_LT \ 3080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = ( args[0] < args[1] ); 3081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_LTEQ \ 3084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = ( args[0] <= args[1] ); 3085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GT \ 3088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = ( args[0] > args[1] ); 3089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_GTEQ \ 3092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = ( args[0] >= args[1] ); 3093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_EQ \ 3096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = ( args[0] == args[1] ); 3097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NEQ \ 3100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = ( args[0] != args[1] ); 3101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ODD \ 3104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 ); 3105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_EVEN \ 3108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 ); 3109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_AND \ 3112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = ( args[0] && args[1] ); 3113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_OR \ 3116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = ( args[0] || args[1] ); 3117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NOT \ 3120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = !args[0]; 3121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ADD \ 3124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] += args[1]; 3125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_SUB \ 3128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] -= args[1]; 3129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_DIV \ 3132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( args[1] == 0 ) \ 3133727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Divide_By_Zero ); \ 3134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else \ 3135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease args[0] = FT_MulDiv_No_Round( args[0], 64L, args[1] ); 3136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MUL \ 3139727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease args[0] = FT_MulDiv( args[0], args[1], 64L ); 3140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ABS \ 3143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = FT_ABS( args[0] ); 3144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NEG \ 3147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = -args[0]; 3148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_FLOOR \ 3151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = FT_PIX_FLOOR( args[0] ); 3152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_CEILING \ 3155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = FT_PIX_CEIL( args[0] ); 3156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3157727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 3158727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 3159727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_RS \ 3160727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { \ 3161727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ULong I = (FT_ULong)args[0]; \ 3162727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease \ 3163727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease \ 3164727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( BOUNDSL( I, CUR.storeSize ) ) \ 3165727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { \ 3166727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.pedantic_hinting ) \ 3167727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ARRAY_BOUND_ERROR; \ 3168727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else \ 3169727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease args[0] = 0; \ 3170727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } \ 3171727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else \ 3172727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { \ 3173727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* subpixel hinting - avoid Typeman Dstroke and */ \ 3174727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* IStroke and Vacuform rounds */ \ 3175727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease \ 3176727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && \ 3177727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && \ 3178727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( ( I == 24 && \ 3179727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.face->sph_found_func_flags & \ 3180727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( SPH_FDEF_SPACING_1 | \ 3181727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease SPH_FDEF_SPACING_2 ) ) ) || \ 3182727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( I == 22 && \ 3183727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.sph_in_func_flags & \ 3184727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease SPH_FDEF_TYPEMAN_STROKES ) ) || \ 3185727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( I == 8 && \ 3186727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.face->sph_found_func_flags & \ 3187727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease SPH_FDEF_VACUFORM_ROUND_1 ) && \ 3188727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.iup_called ) ) ) \ 3189727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease args[0] = 0; \ 3190727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else \ 3191727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease args[0] = CUR.storage[I]; \ 3192727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } \ 3193727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 3194727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 3195727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 3196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3197aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define DO_RS \ 3198aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { \ 3199aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_ULong I = (FT_ULong)args[0]; \ 3200aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich \ 3201aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich \ 3202aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDSL( I, CUR.storeSize ) ) \ 3203aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { \ 3204aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( CUR.pedantic_hinting ) \ 3205aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { \ 3206aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich ARRAY_BOUND_ERROR; \ 3207aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } \ 3208aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich else \ 3209aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich args[0] = 0; \ 3210aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } \ 3211aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich else \ 3212aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich args[0] = CUR.storage[I]; \ 3213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3215727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 3216727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 3217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3218aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich#define DO_WS \ 3219aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { \ 3220aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_ULong I = (FT_ULong)args[0]; \ 3221aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich \ 3222aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich \ 3223aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDSL( I, CUR.storeSize ) ) \ 3224aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { \ 3225aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( CUR.pedantic_hinting ) \ 3226aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich { \ 3227aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich ARRAY_BOUND_ERROR; \ 3228aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } \ 3229aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich } \ 3230aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich else \ 3231aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich CUR.storage[I] = args[1]; \ 3232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_RCVT \ 3236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 3237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong I = (FT_ULong)args[0]; \ 3238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 3239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 3240aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDSL( I, CUR.cvtSize ) ) \ 3241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 3242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) \ 3243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 3244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ARRAY_BOUND_ERROR; \ 3245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } \ 3246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else \ 3247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = 0; \ 3248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } \ 3249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else \ 3250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = CUR_Func_read_cvt( I ); \ 3251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_WCVTP \ 3255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 3256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong I = (FT_ULong)args[0]; \ 3257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 3258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 3259aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDSL( I, CUR.cvtSize ) ) \ 3260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 3261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) \ 3262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 3263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ARRAY_BOUND_ERROR; \ 3264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } \ 3265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } \ 3266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else \ 3267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_write_cvt( I, args[1] ); \ 3268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_WCVTF \ 3272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 3273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong I = (FT_ULong)args[0]; \ 3274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 3275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project \ 3276aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDSL( I, CUR.cvtSize ) ) \ 3277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 3278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) \ 3279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { \ 3280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ARRAY_BOUND_ERROR; \ 3281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } \ 3282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } \ 3283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else \ 3284727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.cvt[I] = FT_MulFix( args[1], CUR.tt_metrics.scale ); \ 3285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3288727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define DO_DEBUG \ 3289727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Debug_OpCode ); 3290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_ROUND \ 3293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = CUR_Func_round( \ 3294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0], \ 3295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.compensations[CUR.opcode - 0x68] ); 3296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_NROUND \ 3299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = ROUND_None( args[0], \ 3300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.compensations[CUR.opcode - 0x6C] ); 3301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MAX \ 3304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( args[1] > args[0] ) \ 3305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = args[1]; 3306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define DO_MIN \ 3309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( args[1] < args[0] ) \ 3310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = args[1]; 3311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH 3314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef ARRAY_BOUND_ERROR 3317727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define ARRAY_BOUND_ERROR \ 3318727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { \ 3319727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); \ 3320727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return; \ 3321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SVTCA[a]: Set (F and P) Vectors to Coordinate Axis */ 3327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x00-0x01 */ 3328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SVTCA( INS_ARG ) 3332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SVTCA 3334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPVTCA[a]: Set PVector to Coordinate Axis */ 3340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x02-0x03 */ 3341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SPVTCA( INS_ARG ) 3345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SPVTCA 3347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFVTCA[a]: Set FVector to Coordinate Axis */ 3353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x04-0x05 */ 3354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SFVTCA( INS_ARG ) 3358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SFVTCA 3360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPVTL[a]: Set PVector To Line */ 3366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x06-0x07 */ 3367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32 --> */ 3368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SPVTL( INS_ARG ) 3371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SPVTL 3373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFVTL[a]: Set FVector To Line */ 3379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x08-0x09 */ 3380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32 --> */ 3381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SFVTL( INS_ARG ) 3384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SFVTL 3386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFVTPV[]: Set FVector To PVector */ 3392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x0E */ 3393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SFVTPV( INS_ARG ) 3397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SFVTPV 3399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPVFS[]: Set PVector From Stack */ 3405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x0A */ 3406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f2.14 f2.14 --> */ 3407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SPVFS( INS_ARG ) 3410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SPVFS 3412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFVFS[]: Set FVector From Stack */ 3418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x0B */ 3419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f2.14 f2.14 --> */ 3420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SFVFS( INS_ARG ) 3423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SFVFS 3425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GPV[]: Get Projection Vector */ 3431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x0C */ 3432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: ef2.14 --> ef2.14 */ 3433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_GPV( INS_ARG ) 3436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_GPV 3438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GFV[]: Get Freedom Vector */ 3443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x0D */ 3444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: ef2.14 --> ef2.14 */ 3445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_GFV( INS_ARG ) 3448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_GFV 3450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SRP0[]: Set Reference Point 0 */ 3456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x10 */ 3457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 3458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SRP0( INS_ARG ) 3461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SRP0 3463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SRP1[]: Set Reference Point 1 */ 3469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x11 */ 3470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 3471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SRP1( INS_ARG ) 3474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SRP1 3476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SRP2[]: Set Reference Point 2 */ 3482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x12 */ 3483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 3484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SRP2( INS_ARG ) 3487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SRP2 3489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RTHG[]: Round To Half Grid */ 3495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x19 */ 3496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_RTHG( INS_ARG ) 3500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RTHG 3502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RTG[]: Round To Grid */ 3508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x18 */ 3509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_RTG( INS_ARG ) 3513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RTG 3515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RTDG[]: Round To Double Grid */ 3520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x3D */ 3521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_RTDG( INS_ARG ) 3525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RTDG 3527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RUTG[]: Round Up To Grid */ 3532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x7C */ 3533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_RUTG( INS_ARG ) 3537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RUTG 3539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RDTG[]: Round Down To Grid */ 3545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x7D */ 3546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_RDTG( INS_ARG ) 3550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RDTG 3552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROFF[]: Round OFF */ 3558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x7A */ 3559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ROFF( INS_ARG ) 3563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_ROFF 3565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SROUND[]: Super ROUND */ 3571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x76 */ 3572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: Eint8 --> */ 3573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SROUND( INS_ARG ) 3576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SROUND 3578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* S45ROUND[]: Super ROUND 45 degrees */ 3584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x77 */ 3585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 3586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_S45ROUND( INS_ARG ) 3589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_S45ROUND 3591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SLOOP[]: Set LOOP variable */ 3597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x17 */ 3598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32? --> */ 3599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SLOOP( INS_ARG ) 3602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SLOOP 3604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SMD[]: Set Minimum Distance */ 3610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x1A */ 3611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 --> */ 3612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SMD( INS_ARG ) 3615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SMD 3617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SCVTCI[]: Set Control Value Table Cut In */ 3623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x1D */ 3624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 --> */ 3625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SCVTCI( INS_ARG ) 3628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SCVTCI 3630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SSWCI[]: Set Single Width Cut In */ 3636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x1E */ 3637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 --> */ 3638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SSWCI( INS_ARG ) 3641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SSWCI 3643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SSW[]: Set Single Width */ 3649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x1F */ 3650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32? --> */ 3651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SSW( INS_ARG ) 3654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SSW 3656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FLIPON[]: Set auto-FLIP to ON */ 3662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x4D */ 3663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_FLIPON( INS_ARG ) 3667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_FLIPON 3669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FLIPOFF[]: Set auto-FLIP to OFF */ 3675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x4E */ 3676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_FLIPOFF( INS_ARG ) 3680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_FLIPOFF 3682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SANGW[]: Set ANGle Weight */ 3688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x7E */ 3689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 3690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SANGW( INS_ARG ) 3693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* instruction not supported anymore */ 3695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SDB[]: Set Delta Base */ 3701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x5E */ 3702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 3703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SDB( INS_ARG ) 3706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SDB 3708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SDS[]: Set Delta Shift */ 3714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x5F */ 3715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 3716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SDS( INS_ARG ) 3719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SDS 3721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MPPEM[]: Measure Pixel Per EM */ 3727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x4B */ 3728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> Euint16 */ 3729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MPPEM( INS_ARG ) 3732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_MPPEM 3734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MPS[]: Measure Point Size */ 3740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x4C */ 3741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> Euint16 */ 3742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MPS( INS_ARG ) 3745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_MPS 3747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DUP[]: DUPlicate the top stack's element */ 3753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x20 */ 3754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: StkElt --> StkElt StkElt */ 3755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_DUP( INS_ARG ) 3758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_DUP 3760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* POP[]: POP the stack's top element */ 3766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x21 */ 3767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: StkElt --> */ 3768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_POP( INS_ARG ) 3771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* nothing to do */ 3773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CLEAR[]: CLEAR the entire stack */ 3779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x22 */ 3780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: StkElt... --> */ 3781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_CLEAR( INS_ARG ) 3784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_CLEAR 3786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SWAP[]: SWAP the stack's top two elements */ 3792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x23 */ 3793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: 2 * StkElt --> 2 * StkElt */ 3794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SWAP( INS_ARG ) 3797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SWAP 3799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DEPTH[]: return the stack DEPTH */ 3805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x24 */ 3806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> uint32 */ 3807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_DEPTH( INS_ARG ) 3810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_DEPTH 3812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CINDEX[]: Copy INDEXed element */ 3818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x25 */ 3819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32 --> StkElt */ 3820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_CINDEX( INS_ARG ) 3823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_CINDEX 3825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* EIF[]: End IF */ 3831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x59 */ 3832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 3833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_EIF( INS_ARG ) 3836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* nothing to do */ 3838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* JROT[]: Jump Relative On True */ 3844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x78 */ 3845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: StkElt int32 --> */ 3846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_JROT( INS_ARG ) 3849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_JROT 3851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* JMPR[]: JuMP Relative */ 3857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x1C */ 3858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32 --> */ 3859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_JMPR( INS_ARG ) 3862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_JMPR 3864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* JROF[]: Jump Relative On False */ 3870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x79 */ 3871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: StkElt int32 --> */ 3872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_JROF( INS_ARG ) 3875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_JROF 3877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* LT[]: Less Than */ 3883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x50 */ 3884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32? int32? --> bool */ 3885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_LT( INS_ARG ) 3888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_LT 3890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* LTEQ[]: Less Than or EQual */ 3896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x51 */ 3897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32? int32? --> bool */ 3898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_LTEQ( INS_ARG ) 3901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_LTEQ 3903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GT[]: Greater Than */ 3909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x52 */ 3910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32? int32? --> bool */ 3911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_GT( INS_ARG ) 3914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_GT 3916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GTEQ[]: Greater Than or EQual */ 3922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x53 */ 3923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32? int32? --> bool */ 3924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_GTEQ( INS_ARG ) 3927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_GTEQ 3929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* EQ[]: EQual */ 3935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x54 */ 3936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: StkElt StkElt --> bool */ 3937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_EQ( INS_ARG ) 3940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_EQ 3942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NEQ[]: Not EQual */ 3948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x55 */ 3949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: StkElt StkElt --> bool */ 3950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_NEQ( INS_ARG ) 3953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_NEQ 3955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ODD[]: Is ODD */ 3961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x56 */ 3962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 --> bool */ 3963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ODD( INS_ARG ) 3966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_ODD 3968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* EVEN[]: Is EVEN */ 3974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x57 */ 3975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 --> bool */ 3976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_EVEN( INS_ARG ) 3979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_EVEN 3981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* AND[]: logical AND */ 3987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x5A */ 3988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32 --> uint32 */ 3989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 3991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_AND( INS_ARG ) 3992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 3993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_AND 3994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 3995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 3997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 3998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 3999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* OR[]: logical OR */ 4000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x5B */ 4001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32 --> uint32 */ 4002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_OR( INS_ARG ) 4005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_OR 4007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NOT[]: logical NOT */ 4013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x5C */ 4014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: StkElt --> uint32 */ 4015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_NOT( INS_ARG ) 4018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_NOT 4020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ADD[]: ADD */ 4026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x60 */ 4027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 f26.6 --> f26.6 */ 4028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ADD( INS_ARG ) 4031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_ADD 4033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SUB[]: SUBtract */ 4039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x61 */ 4040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 f26.6 --> f26.6 */ 4041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SUB( INS_ARG ) 4044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SUB 4046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DIV[]: DIVide */ 4052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x62 */ 4053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 f26.6 --> f26.6 */ 4054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_DIV( INS_ARG ) 4057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_DIV 4059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MUL[]: MULtiply */ 4065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x63 */ 4066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 f26.6 --> f26.6 */ 4067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MUL( INS_ARG ) 4070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_MUL 4072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ABS[]: ABSolute value */ 4078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x64 */ 4079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 --> f26.6 */ 4080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ABS( INS_ARG ) 4083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_ABS 4085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NEG[]: NEGate */ 4091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x65 */ 4092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 --> f26.6 */ 4093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_NEG( INS_ARG ) 4096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_NEG 4098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FLOOR[]: FLOOR */ 4104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x66 */ 4105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 --> f26.6 */ 4106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_FLOOR( INS_ARG ) 4109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_FLOOR 4111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CEILING[]: CEILING */ 4117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x67 */ 4118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 --> f26.6 */ 4119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_CEILING( INS_ARG ) 4122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_CEILING 4124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RS[]: Read Store */ 4130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x43 */ 4131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> uint32 */ 4132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_RS( INS_ARG ) 4135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RS 4137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* WS[]: Write Store */ 4143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x42 */ 4144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32 --> */ 4145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_WS( INS_ARG ) 4148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_WS 4150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* WCVTP[]: Write CVT in Pixel units */ 4156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x44 */ 4157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 uint32 --> */ 4158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_WCVTP( INS_ARG ) 4161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_WCVTP 4163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* WCVTF[]: Write CVT in Funits */ 4169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x70 */ 4170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32 --> */ 4171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_WCVTF( INS_ARG ) 4174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_WCVTF 4176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RCVT[]: Read CVT */ 4182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x45 */ 4183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> f26.6 */ 4184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_RCVT( INS_ARG ) 4187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RCVT 4189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* AA[]: Adjust Angle */ 4195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x7F */ 4196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 4197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_AA( INS_ARG ) 4200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* intentionally no longer supported */ 4202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DEBUG[]: DEBUG. Unsupported. */ 4208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x4F */ 4209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 4210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Note: The original instruction pops a value from the stack. */ 4212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_DEBUG( INS_ARG ) 4215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_DEBUG 4217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROUND[ab]: ROUND value */ 4223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x68-0x6B */ 4224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 --> f26.6 */ 4225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ROUND( INS_ARG ) 4228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_ROUND 4230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NROUND[ab]: No ROUNDing of value */ 4236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x6C-0x6F */ 4237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 --> f26.6 */ 4238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_NROUND( INS_ARG ) 4241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_NROUND 4243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MAX[]: MAXimum */ 4249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x68 */ 4250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32? int32? --> int32 */ 4251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MAX( INS_ARG ) 4254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_MAX 4256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIN[]: MINimum */ 4262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x69 */ 4263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32? int32? --> int32 */ 4264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MIN( INS_ARG ) 4267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_MIN 4269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */ 4273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* The following functions are called as is within the switch statement. */ 4278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MINDEX[]: Move INDEXed element */ 4285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x26 */ 4286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32? --> StkElt */ 4287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MINDEX( INS_ARG ) 4290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long L, K; 4292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = args[0]; 4295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( L <= 0 || L > CUR.args ) 4297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4298aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( CUR.pedantic_hinting ) 4299727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 4300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4301aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner else 4302aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 4303aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner K = CUR.stack[CUR.args - L]; 4304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4305aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_ARRAY_MOVE( &CUR.stack[CUR.args - L ], 4306aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner &CUR.stack[CUR.args - L + 1], 4307aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner ( L - 1 ) ); 4308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4309aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CUR.stack[CUR.args - 1] = K; 4310aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 4311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROLL[]: ROLL top three elements */ 4317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x8A */ 4318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: 3 * StkElt --> 3 * StkElt */ 4319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ROLL( INS_ARG ) 4322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long A, B, C; 4324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_EXEC; 4326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = args[2]; 4329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = args[1]; 4330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C = args[0]; 4331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[2] = C; 4333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[1] = A; 4334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = B; 4335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MANAGING THE FLOW OF CONTROL */ 4341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Instructions appear in the specification's order. */ 4343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Bool 4348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project SkipCode( EXEC_OP ) 4349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.IP += CUR.length; 4351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.IP < CUR.codeSize ) 4353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.opcode = CUR.code[CUR.IP]; 4355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.length = opcode_length[CUR.opcode]; 4357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.length < 0 ) 4358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 435941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( CUR.IP + 1 >= CUR.codeSize ) 4360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail_Overflow; 4361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1]; 4362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.IP + CUR.length <= CUR.codeSize ) 4365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return SUCCESS; 4366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Fail_Overflow: 4369727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Code_Overflow ); 4370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FAILURE; 4371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IF[]: IF test */ 4377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x58 */ 4378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: StkElt --> */ 4379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_IF( INS_ARG ) 4382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int nIfs; 4384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool Out; 4385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( args[0] != 0 ) 4388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project nIfs = 1; 4391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Out = 0; 4392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project do 4394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( SKIP_Code() == FAILURE ) 4396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( CUR.opcode ) 4399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x58: /* IF */ 4401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project nIfs++; 4402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x1B: /* ELSE */ 4405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Out = FT_BOOL( nIfs == 1 ); 4406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x59: /* EIF */ 4409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project nIfs--; 4410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Out = FT_BOOL( nIfs == 0 ); 4411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } while ( Out == 0 ); 4414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ELSE[]: ELSE */ 4420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x1B */ 4421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 4422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ELSE( INS_ARG ) 4425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int nIfs; 4427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_ARG; 4429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project nIfs = 1; 4432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project do 4434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( SKIP_Code() == FAILURE ) 4436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( CUR.opcode ) 4439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x58: /* IF */ 4441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project nIfs++; 4442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x59: /* EIF */ 4445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project nIfs--; 4446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } while ( nIfs != 0 ); 4449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS */ 4455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Instructions appear in the specification's order. */ 4457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FDEF[]: Function DEFinition */ 4464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x2C */ 4465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 4466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_FDEF( INS_ARG ) 4469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong n; 4471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DefRecord* rec; 4472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DefRecord* limit; 4473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4474727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 4475727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* arguments to opcodes are skipped by `SKIP_Code' */ 4476727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Byte opcode_pattern[9][12] = { 4477727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* #0 inline delta function 1 */ 4478727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4479727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x4B, /* PPEM */ 4480727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x53, /* GTEQ */ 4481727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x23, /* SWAP */ 4482727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x4B, /* PPEM */ 4483727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x51, /* LTEQ */ 4484727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x5A, /* AND */ 4485727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x58, /* IF */ 4486727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x38, /* SHPIX */ 4487727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x1B, /* ELSE */ 4488727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x21, /* POP */ 4489727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x21, /* POP */ 4490727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x59 /* EIF */ 4491727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease }, 4492727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* #1 inline delta function 2 */ 4493727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4494727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x4B, /* PPEM */ 4495727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x54, /* EQ */ 4496727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x58, /* IF */ 4497727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x38, /* SHPIX */ 4498727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x1B, /* ELSE */ 4499727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x21, /* POP */ 4500727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x21, /* POP */ 4501727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x59 /* EIF */ 4502727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease }, 4503727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* #2 diagonal stroke function */ 4504727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4505727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x20, /* DUP */ 4506727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x20, /* DUP */ 4507727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0xB0, /* PUSHB_1 */ 4508727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* 1 */ 4509727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x60, /* ADD */ 4510727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x46, /* GC_cur */ 4511727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0xB0, /* PUSHB_1 */ 4512727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* 64 */ 4513727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x23, /* SWAP */ 4514727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x42 /* WS */ 4515727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease }, 4516727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* #3 VacuFormRound function */ 4517727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4518727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x45, /* RCVT */ 4519727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x23, /* SWAP */ 4520727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x46, /* GC_cur */ 4521727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x60, /* ADD */ 4522727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x20, /* DUP */ 4523727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0xB0 /* PUSHB_1 */ 4524727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* 38 */ 4525727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease }, 4526727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* #4 TTFautohint bytecode (old) */ 4527727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4528727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x20, /* DUP */ 4529727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x64, /* ABS */ 4530727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0xB0, /* PUSHB_1 */ 4531727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* 32 */ 4532727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x60, /* ADD */ 4533727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x66, /* FLOOR */ 4534727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x23, /* SWAP */ 4535727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0xB0 /* PUSHB_1 */ 4536727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease }, 4537727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* #5 spacing function 1 */ 4538727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4539727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x01, /* SVTCA_x */ 4540727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0xB0, /* PUSHB_1 */ 4541727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* 24 */ 4542727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x43, /* RS */ 4543727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x58 /* IF */ 4544727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease }, 4545727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* #6 spacing function 2 */ 4546727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4547727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x01, /* SVTCA_x */ 4548727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x18, /* RTG */ 4549727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0xB0, /* PUSHB_1 */ 4550727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* 24 */ 4551727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x43, /* RS */ 4552727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x58 /* IF */ 4553727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease }, 4554727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* #7 TypeMan Talk DiagEndCtrl function */ 4555727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4556727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x01, /* SVTCA_x */ 4557727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x20, /* DUP */ 4558727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0xB0, /* PUSHB_1 */ 4559727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* 3 */ 4560727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x25, /* CINDEX */ 4561727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease }, 4562727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* #8 TypeMan Talk Align */ 4563727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4564727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x06, /* SPVTL */ 4565727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x7D, /* RDTG */ 4566727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease }, 4567727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease }; 4568727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_UShort opcode_patterns = 9; 4569727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_UShort opcode_pointer[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 4570727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_UShort opcode_size[9] = { 12, 8, 8, 6, 7, 4, 5, 4, 2 }; 4571727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_UShort i; 4572727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 4573727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* some font programs are broken enough to redefine functions! */ 4576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We will then parse the current table. */ 4577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project rec = CUR.FDefs; 4579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project limit = rec + CUR.numFDefs; 4580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project n = args[0]; 4581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; rec < limit; rec++ ) 4583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( rec->opc == n ) 4585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 4586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( rec == limit ) 4589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check that there is enough room for new functions */ 4591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.numFDefs >= CUR.maxFDefs ) 4592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4593727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Too_Many_Function_Defs ); 4594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.numFDefs++; 4597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4599295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* Although FDEF takes unsigned 32-bit integer, */ 4600295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* func # must be within unsigned 16-bit integer */ 4601295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( n > 0xFFFFU ) 4602295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner { 4603727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Too_Many_Function_Defs ); 4604295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner return; 4605295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner } 4606295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 4607727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->range = CUR.curRange; 4608727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->opc = (FT_UInt16)n; 4609727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->start = CUR.IP + 1; 4610727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->active = TRUE; 4611727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->inline_delta = FALSE; 4612727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->sph_fdef_flags = 0x0000; 4613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( n > CUR.maxFunc ) 4615295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner CUR.maxFunc = (FT_UInt16)n; 4616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4617727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 4618727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* We don't know for sure these are typeman functions, */ 4619727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* however they are only active when RS 22 is called */ 4620727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( n >= 64 && n <= 66 ) 4621727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES; 4622727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 4623727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Now skip the whole function definition. */ 4625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We don't allow nested IDEFS & FDEFs. */ 4626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( SKIP_Code() == SUCCESS ) 4628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4629727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4630727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 4631727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4632727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING ) 4633727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4634727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease for ( i = 0; i < opcode_patterns; i++ ) 4635727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4636727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( opcode_pointer[i] < opcode_size[i] && 4637727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.opcode == opcode_pattern[i][opcode_pointer[i]] ) 4638727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4639727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease opcode_pointer[i] += 1; 4640727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4641727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( opcode_pointer[i] == opcode_size[i] ) 4642727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4643727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_TRACE7(( "sph: Function %d, opcode ptrn: %d, %s %s\n", 4644727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease i, n, 4645727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->root.family_name, 4646727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->root.style_name )); 4647727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4648727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease switch ( i ) 4649727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4650727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 0: 4651727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->sph_fdef_flags |= SPH_FDEF_INLINE_DELTA_1; 4652727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1; 4653727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease break; 4654727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4655727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 1: 4656727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->sph_fdef_flags |= SPH_FDEF_INLINE_DELTA_2; 4657727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2; 4658727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease break; 4659727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4660727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 2: 4661727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease switch ( n ) 4662727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4663727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* needs to be implemented still */ 4664727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 58: 4665727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->sph_fdef_flags |= SPH_FDEF_DIAGONAL_STROKE; 4666727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE; 4667727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 4668727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease break; 4669727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4670727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 3: 4671727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease switch ( n ) 4672727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4673727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 0: 4674727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->sph_fdef_flags |= SPH_FDEF_VACUFORM_ROUND_1; 4675727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1; 4676727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 4677727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease break; 4678727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4679727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 4: 4680727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* probably not necessary to detect anymore */ 4681727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->sph_fdef_flags |= SPH_FDEF_TTFAUTOHINT_1; 4682727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1; 4683727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease break; 4684727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4685727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 5: 4686727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease switch ( n ) 4687727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4688727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 0: 4689727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 1: 4690727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 2: 4691727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 4: 4692727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 7: 4693727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 8: 4694727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->sph_fdef_flags |= SPH_FDEF_SPACING_1; 4695727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_1; 4696727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 4697727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease break; 4698727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4699727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 6: 4700727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease switch ( n ) 4701727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 4702727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 0: 4703727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 1: 4704727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 2: 4705727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 4: 4706727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 7: 4707727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 8: 4708727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->sph_fdef_flags |= SPH_FDEF_SPACING_2; 4709727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_2; 4710727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 4711727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease break; 4712727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4713727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 7: 4714727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; 4715727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; 4716727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease break; 4717727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4718727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 8: 4719727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#if 0 4720727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; 4721727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; 4722727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 4723727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease break; 4724727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 4725727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease opcode_pointer[i] = 0; 4726727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 4727727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 4728727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4729727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 4730727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease opcode_pointer[i] = 0; 4731727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 4732727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4733727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Set sph_compatibility_mode only when deltas are detected */ 4734727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->sph_compatibility_mode = 4735727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) | 4736727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ); 4737727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 4738727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4739727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 4740727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( CUR.opcode ) 4742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x89: /* IDEF */ 4744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x2C: /* FDEF */ 4745727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Nested_DEFS ); 4746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x2D: /* ENDF */ 474941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier rec->end = CUR.IP; 4750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ENDF[]: END Function definition */ 4759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x2D */ 4760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 4761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ENDF( INS_ARG ) 4764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_CallRec* pRec; 4766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_ARG; 4768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4770727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 4771727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.sph_in_func_flags = 0x0000; 4772727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 4773727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.callTop <= 0 ) /* We encountered an ENDF without a call */ 4775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4776727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( ENDF_In_Exec_Stream ); 4777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.callTop--; 4781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pRec = &CUR.callStack[CUR.callTop]; 4783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pRec->Cur_Count--; 4785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.step_ins = FALSE; 4787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( pRec->Cur_Count > 0 ) 4789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.callTop++; 4791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.IP = pRec->Cur_Restart; 4792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 4794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Loop through the current function */ 4795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project INS_Goto_CodeRange( pRec->Caller_Range, 4796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pRec->Caller_IP ); 4797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Exit the current call frame. */ 4799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NOTE: If the last instruction of a program is a */ 4801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CALL or LOOPCALL, the return address is */ 4802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* always out of the code range. This is a */ 4803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* valid address, and it is why we do not test */ 4804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* the result of Ins_Goto_CodeRange() here! */ 4805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CALL[]: CALL function */ 4811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x2B */ 4812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32? --> */ 4813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_CALL( INS_ARG ) 4816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong F; 4818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_CallRec* pCrec; 4819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DefRecord* def; 4820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* first of all, check the index */ 4823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project F = args[0]; 4825aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDSL( F, CUR.maxFunc + 1 ) ) 4826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 4827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Except for some old Apple fonts, all functions in a TrueType */ 4829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* font are defined in increasing order, starting from 0. This */ 4830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* means that we normally have */ 4831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CUR.maxFunc+1 == CUR.numFDefs */ 4833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */ 4834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* If this isn't true, we need to look up the function table. */ 4836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project def = CUR.FDefs + F; 4838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F ) 4839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* look up the FDefs table */ 4841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DefRecord* limit; 4842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project def = CUR.FDefs; 4845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project limit = def + CUR.numFDefs; 4846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( def < limit && def->opc != F ) 4848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project def++; 4849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( def == limit ) 4851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 4852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check that the function is active */ 4855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !def->active ) 4856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 4857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4858727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 4859727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 4860727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 4861727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( ( CUR.iup_called && 4862727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) || 4863727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) ) ) 4864727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease goto Fail; 4865727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 4866727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.sph_in_func_flags = def->sph_fdef_flags; 4867727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 4868727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check the call stack */ 4870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.callTop >= CUR.callSize ) 4871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4872727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Stack_Overflow ); 4873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pCrec = CUR.callStack + CUR.callTop; 4877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pCrec->Caller_Range = CUR.curRange; 4879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pCrec->Caller_IP = CUR.IP + 1; 4880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pCrec->Cur_Count = 1; 4881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pCrec->Cur_Restart = def->start; 488241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier pCrec->Cur_End = def->end; 4883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.callTop++; 4885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project INS_Goto_CodeRange( def->range, 4887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project def->start ); 4888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.step_ins = FALSE; 4890727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Fail: 4894727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 4895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* LOOPCALL[]: LOOP and CALL function */ 4901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x2A */ 4902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32? Eint16? --> */ 4903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_LOOPCALL( INS_ARG ) 4906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong F; 4908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_CallRec* pCrec; 4909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DefRecord* def; 4910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* first of all, check the index */ 4913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project F = args[1]; 4914aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDSL( F, CUR.maxFunc + 1 ) ) 4915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 4916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Except for some old Apple fonts, all functions in a TrueType */ 4918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* font are defined in increasing order, starting from 0. This */ 4919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* means that we normally have */ 4920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CUR.maxFunc+1 == CUR.numFDefs */ 4922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */ 4923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* If this isn't true, we need to look up the function table. */ 4925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project def = CUR.FDefs + F; 4927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F ) 4928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* look up the FDefs table */ 4930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DefRecord* limit; 4931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project def = CUR.FDefs; 4934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project limit = def + CUR.numFDefs; 4935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( def < limit && def->opc != F ) 4937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project def++; 4938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( def == limit ) 4940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 4941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check that the function is active */ 4944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !def->active ) 4945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 4946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4947727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 4948727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 4949727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 4950727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) ) 4951727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease goto Fail; 4952727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 4953727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.sph_in_func_flags = def->sph_fdef_flags; 4954727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 4955727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check stack */ 4957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.callTop >= CUR.callSize ) 4958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4959727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Stack_Overflow ); 4960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( args[0] > 0 ) 4964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pCrec = CUR.callStack + CUR.callTop; 4966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pCrec->Caller_Range = CUR.curRange; 4968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pCrec->Caller_IP = CUR.IP + 1; 4969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pCrec->Cur_Count = (FT_Int)args[0]; 4970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pCrec->Cur_Restart = def->start; 497141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier pCrec->Cur_End = def->end; 4972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.callTop++; 4974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project INS_Goto_CodeRange( def->range, def->start ); 4976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.step_ins = FALSE; 4978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4979727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 4980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 4981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Fail: 4983727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 4984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 4985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 4988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IDEF[]: Instruction DEFinition */ 4990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x89 */ 4991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: Eint8 --> */ 4992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 4993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 4994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_IDEF( INS_ARG ) 4995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 4996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DefRecord* def; 4997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DefRecord* limit; 4998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 4999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* First of all, look for the same function in our table */ 5001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project def = CUR.IDefs; 5003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project limit = def + CUR.numIDefs; 5004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; def < limit; def++ ) 5006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( def->opc == (FT_ULong)args[0] ) 5007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 5008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( def == limit ) 5010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check that there is enough room for a new instruction */ 5012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.numIDefs >= CUR.maxIDefs ) 5013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5014727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Too_Many_Instruction_Defs ); 5015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.numIDefs++; 5018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5020295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner /* opcode must be unsigned 8-bit integer */ 5021295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner if ( 0 > args[0] || args[0] > 0x00FF ) 5022295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner { 5023727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Too_Many_Instruction_Defs ); 5024295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner return; 5025295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner } 5026295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 5027295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner def->opc = (FT_Byte)args[0]; 5028aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich def->start = CUR.IP + 1; 5029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project def->range = CUR.curRange; 5030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project def->active = TRUE; 5031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( (FT_ULong)args[0] > CUR.maxIns ) 5033295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner CUR.maxIns = (FT_Byte)args[0]; 5034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Now skip the whole function definition. */ 5036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* We don't allow nested IDEFs & FDEFs. */ 5037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( SKIP_Code() == SUCCESS ) 5039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( CUR.opcode ) 5041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x89: /* IDEF */ 5043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x2C: /* FDEF */ 5044727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Nested_DEFS ); 5045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x2D: /* ENDF */ 5047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PUSHING DATA ONTO THE INTERPRETER STACK */ 5056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Instructions appear in the specification's order. */ 5058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NPUSHB[]: PUSH N Bytes */ 5065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x40 */ 5066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> uint32... */ 5067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_NPUSHB( INS_ARG ) 5070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort L, K; 5072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = (FT_UShort)CUR.code[CUR.IP + 1]; 5075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) 5077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5078727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Stack_Overflow ); 5079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( K = 1; K <= L; K++ ) 5083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[K - 1] = CUR.code[CUR.IP + K + 1]; 5084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top += L; 5086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NPUSHW[]: PUSH N Words */ 5092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x41 */ 5093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> int32... */ 5094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_NPUSHW( INS_ARG ) 5097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort L, K; 5099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = (FT_UShort)CUR.code[CUR.IP + 1]; 5102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) 5104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5105727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Stack_Overflow ); 5106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.IP += 2; 5110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( K = 0; K < L; K++ ) 5112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[K] = GET_ShortIns(); 5113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.step_ins = FALSE; 5115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top += L; 5116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PUSHB[abc]: PUSH Bytes */ 5122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0xB0-0xB7 */ 5123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> uint32... */ 5124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_PUSHB( INS_ARG ) 5127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort L, K; 5129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = (FT_UShort)( CUR.opcode - 0xB0 + 1 ); 5132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) 5134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Stack_Overflow ); 5136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( K = 1; K <= L; K++ ) 5140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[K - 1] = CUR.code[CUR.IP + K]; 5141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PUSHW[abc]: PUSH Words */ 5147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0xB8-0xBF */ 5148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> int32... */ 5149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_PUSHW( INS_ARG ) 5152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort L, K; 5154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = (FT_UShort)( CUR.opcode - 0xB8 + 1 ); 5157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) 5159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5160727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Stack_Overflow ); 5161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.IP++; 5165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( K = 0; K < L; K++ ) 5167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[K] = GET_ShortIns(); 5168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.step_ins = FALSE; 5170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MANAGING THE GRAPHICS STATE */ 5176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Instructions appear in the specs' order. */ 5178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GC[a]: Get Coordinate projected onto */ 5185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x46-0x47 */ 5186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> f26.6 */ 5187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 518841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken */ 518941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* along the dual projection vector! */ 5190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_GC( INS_ARG ) 5193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong L; 5195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 R; 5196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = (FT_ULong)args[0]; 5199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5200aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDSL( L, CUR.zp2.n_points ) ) 5201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5203727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5204aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner R = 0; 5205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 5207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.opcode & 1 ) 5209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project R = CUR_fast_dualproj( &CUR.zp2.org[L] ); 5210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 5211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project R = CUR_fast_project( &CUR.zp2.cur[L] ); 5212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = R; 5215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SCFS[]: Set Coordinate From Stack */ 5221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x48 */ 5222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 uint32 --> */ 5223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Formula: */ 5225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* OA := OA + ( value - OA.p )/( f.p ) * f */ 5227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SCFS( INS_ARG ) 5230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long K; 5232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort L; 5233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = (FT_UShort)args[0]; 5236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( L, CUR.zp2.n_points ) ) 5238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5240727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project K = CUR_fast_project( &CUR.zp2.cur[L] ); 5245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_move( &CUR.zp2, L, args[1] - K ); 5247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5248aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* UNDOCUMENTED! The MS rasterizer does that with */ 5249aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* twilight points (confirmed by Greg Hitchcock) */ 5250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.gep2 == 0 ) 5251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.org[L] = CUR.zp2.cur[L]; 5252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MD[a]: Measure Distance */ 5258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x49-0x4A */ 5259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32 --> f26.6 */ 5260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 526141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along */ 526241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* the dual projection vector. */ 5263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 526441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* XXX: UNDOCUMENTED: Flag attributes are inverted! */ 526541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* 0 => measure distance in original outline */ 526641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* 1 => measure distance in grid-fitted outline */ 5267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 526841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1! */ 5269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MD( INS_ARG ) 5272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort K, L; 5274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 D; 5275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project K = (FT_UShort)args[1]; 5278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = (FT_UShort)args[0]; 5279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5280aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDS( L, CUR.zp0.n_points ) || 5281aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich BOUNDS( K, CUR.zp1.n_points ) ) 5282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5284727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D = 0; 5286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 5288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.opcode & 1 ) 5290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K ); 5291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 5292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 529327811904d8de0ce5591417812ca31163bf5aad60Geremy Condra /* XXX: UNDOCUMENTED: twilight zone special case */ 5294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 529527811904d8de0ce5591417812ca31163bf5aad60Geremy Condra if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 ) 5296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 529727811904d8de0ce5591417812ca31163bf5aad60Geremy Condra FT_Vector* vec1 = CUR.zp0.org + L; 529827811904d8de0ce5591417812ca31163bf5aad60Geremy Condra FT_Vector* vec2 = CUR.zp1.org + K; 529927811904d8de0ce5591417812ca31163bf5aad60Geremy Condra 530027811904d8de0ce5591417812ca31163bf5aad60Geremy Condra 5301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project D = CUR_Func_dualproj( vec1, vec2 ); 5302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 5304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 530527811904d8de0ce5591417812ca31163bf5aad60Geremy Condra FT_Vector* vec1 = CUR.zp0.orus + L; 530627811904d8de0ce5591417812ca31163bf5aad60Geremy Condra FT_Vector* vec2 = CUR.zp1.orus + K; 5307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 530927811904d8de0ce5591417812ca31163bf5aad60Geremy Condra if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) 531027811904d8de0ce5591417812ca31163bf5aad60Geremy Condra { 531127811904d8de0ce5591417812ca31163bf5aad60Geremy Condra /* this should be faster */ 531227811904d8de0ce5591417812ca31163bf5aad60Geremy Condra D = CUR_Func_dualproj( vec1, vec2 ); 5313727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease D = FT_MulFix( D, CUR.metrics.x_scale ); 531427811904d8de0ce5591417812ca31163bf5aad60Geremy Condra } 531527811904d8de0ce5591417812ca31163bf5aad60Geremy Condra else 531627811904d8de0ce5591417812ca31163bf5aad60Geremy Condra { 531727811904d8de0ce5591417812ca31163bf5aad60Geremy Condra FT_Vector vec; 531827811904d8de0ce5591417812ca31163bf5aad60Geremy Condra 5319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5320727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale ); 5321727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale ); 532227811904d8de0ce5591417812ca31163bf5aad60Geremy Condra 532327811904d8de0ce5591417812ca31163bf5aad60Geremy Condra D = CUR_fast_dualproj( &vec ); 532427811904d8de0ce5591417812ca31163bf5aad60Geremy Condra } 5325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5329727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 5330727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */ 5331727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 5332727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && FT_ABS( D ) == 64 ) 5333727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease D += 1; 5334727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 5335727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 5336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = D; 5337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SDPVTL[a]: Set Dual PVector to Line */ 5343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x86-0x87 */ 5344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32 --> */ 5345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SDPVTL( INS_ARG ) 5348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long A, B, C; 5350aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_UShort p1, p2; /* was FT_Int in pas type ERROR */ 5351aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Int aOpc = CUR.opcode; 5352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p1 = (FT_UShort)args[1]; 5355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p2 = (FT_UShort)args[0]; 5356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( p2, CUR.zp1.n_points ) || 5358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( p1, CUR.zp2.n_points ) ) 5359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5361727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* v1 = CUR.zp1.org + p2; 5367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* v2 = CUR.zp2.org + p1; 5368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = v1->x - v2->x; 5371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = v1->y - v2->y; 5372aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 5373aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* If v1 == v2, SDPVTL behaves the same as */ 5374aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* SVTCA[X], respectively. */ 5375aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* */ 5376aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Confirmed by Greg Hitchcock. */ 5377aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 5378aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( A == 0 && B == 0 ) 5379aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 5380aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner A = 0x4000; 5381aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner aOpc = 0; 5382aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 5383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5385aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( ( aOpc & 1 ) != 0 ) 5386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C = B; /* counter clockwise rotation */ 5388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = A; 5389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = -C; 5390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NORMalize( A, B, &CUR.GS.dualVector ); 5393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* v1 = CUR.zp1.cur + p2; 5396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* v2 = CUR.zp2.cur + p1; 5397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = v1->x - v2->x; 5400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = v1->y - v2->y; 5401727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 5402727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( A == 0 && B == 0 ) 5403727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 5404727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease A = 0x4000; 5405727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease aOpc = 0; 5406727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 5407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5409aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( ( aOpc & 1 ) != 0 ) 5410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C = B; /* counter clockwise rotation */ 5412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = A; 5413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = -C; 5414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project NORMalize( A, B, &CUR.GS.projVector ); 5417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GUESS_VECTOR( freeVector ); 5419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project COMPUTE_Funcs(); 5421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SZP0[]: Set Zone Pointer 0 */ 5427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x13 */ 5428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 5429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SZP0( INS_ARG ) 5432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( (FT_Int)args[0] ) 5434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0: 5436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0 = CUR.twilight; 5437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 5438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 1: 5440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0 = CUR.pts; 5441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 5442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 5444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5445727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.gep0 = (FT_UShort)args[0]; 5450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SZP1[]: Set Zone Pointer 1 */ 5456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x14 */ 5457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 5458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SZP1( INS_ARG ) 5461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( (FT_Int)args[0] ) 5463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0: 5465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp1 = CUR.twilight; 5466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 5467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 1: 5469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp1 = CUR.pts; 5470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 5471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 5473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5474727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.gep1 = (FT_UShort)args[0]; 5479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SZP2[]: Set Zone Pointer 2 */ 5485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x15 */ 5486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 5487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SZP2( INS_ARG ) 5490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( (FT_Int)args[0] ) 5492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0: 5494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2 = CUR.twilight; 5495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 5496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 1: 5498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2 = CUR.pts; 5499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 5500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 5502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5503727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.gep2 = (FT_UShort)args[0]; 5508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SZPS[]: Set Zone PointerS */ 5514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x16 */ 5515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 5516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SZPS( INS_ARG ) 5519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( (FT_Int)args[0] ) 5521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0: 5523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0 = CUR.twilight; 5524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 5525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 1: 5527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0 = CUR.pts; 5528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 5529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 5531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5532727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp1 = CUR.zp0; 5537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2 = CUR.zp0; 5538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.gep0 = (FT_UShort)args[0]; 5540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.gep1 = (FT_UShort)args[0]; 5541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.gep2 = (FT_UShort)args[0]; 5542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INSTCTRL[]: INSTruction ConTRoL */ 5548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x8e */ 5549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32 int32 --> */ 5550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_INSTCTRL( INS_ARG ) 5553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long K, L; 5555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project K = args[1]; 5558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = args[0]; 5559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( K < 1 || K > 2 ) 5561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5563727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( L != 0 ) 5568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = K; 5569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.instruct_control = FT_BOOL( 5571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L ); 5572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SCANCTRL[]: SCAN ConTRoL */ 5578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x85 */ 5579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32? --> */ 5580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SCANCTRL( INS_ARG ) 5583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int A; 5585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Get Threshold */ 5588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = (FT_Int)( args[0] & 0xFF ); 5589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( A == 0xFF ) 5591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.scan_control = TRUE; 5593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( A == 0 ) 5596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.scan_control = FALSE; 5598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 56010a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A ) 5602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.scan_control = TRUE; 5603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated ) 5605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.scan_control = TRUE; 5606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched ) 5608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.scan_control = TRUE; 5609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 56100a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A ) 5611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.scan_control = FALSE; 5612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated ) 5614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.scan_control = FALSE; 5615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched ) 5617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.scan_control = FALSE; 5618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SCANTYPE[]: SCAN TYPE */ 5624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x8D */ 5625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32? --> */ 5626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SCANTYPE( INS_ARG ) 5629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 56300a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project if ( args[0] >= 0 ) 5631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.scan_type = (FT_Int)args[0]; 5632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MANAGING OUTLINES */ 5638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Instructions appear in the specification's order. */ 5640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FLIPPT[]: FLIP PoinT */ 5647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x80 */ 5648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32... --> */ 5649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_FLIPPT( INS_ARG ) 5652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point; 5654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_ARG; 5656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.top < CUR.GS.loop ) 5659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5660aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( CUR.pedantic_hinting ) 5661727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Too_Few_Arguments ); 5662aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner goto Fail; 5663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( CUR.GS.loop > 0 ) 5666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.args--; 5668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point = (FT_UShort)CUR.stack[CUR.args]; 5670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( point, CUR.pts.n_points ) ) 5672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5675727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 5680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.pts.tags[point] ^= FT_CURVE_TAG_ON; 5681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.loop--; 5683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5685aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner Fail: 5686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.loop = 1; 5687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top = CUR.args; 5688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FLIPRGON[]: FLIP RanGe ON */ 5694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x81 */ 5695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32 --> */ 5696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_FLIPRGON( INS_ARG ) 5699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort I, K, L; 5701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project K = (FT_UShort)args[1]; 5704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = (FT_UShort)args[0]; 5705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( K, CUR.pts.n_points ) || 5707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( L, CUR.pts.n_points ) ) 5708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5710727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( I = L; I <= K; I++ ) 5715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.pts.tags[I] |= FT_CURVE_TAG_ON; 5716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FLIPRGOFF: FLIP RanGe OFF */ 5722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x82 */ 5723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32 --> */ 5724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_FLIPRGOFF( INS_ARG ) 5727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort I, K, L; 5729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project K = (FT_UShort)args[1]; 5732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project L = (FT_UShort)args[0]; 5733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( K, CUR.pts.n_points ) || 5735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( L, CUR.pts.n_points ) ) 5736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5738727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( I = L; I <= K; I++ ) 5743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON; 5744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Bool 5748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6* x, 5749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6* y, 5750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_GlyphZone zone, 5751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort* refp ) 5752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_GlyphZoneRec zp; 5754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort p; 5755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 d; 5756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.opcode & 1 ) 5759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zp = CUR.zp0; 5761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p = CUR.GS.rp1; 5762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 5764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project zp = CUR.zp1; 5766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p = CUR.GS.rp2; 5767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( p, zp.n_points ) ) 5770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5772727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *refp = 0; 5774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return FAILURE; 5775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *zone = zp; 5778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *refp = p; 5779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project d = CUR_Func_project( zp.cur + p, zp.org + p ); 5781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 5783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.face->unpatented_hinting ) 5784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.both_x_axis ) 5786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *x = d; 5788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *y = 0; 5789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 5791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *x = 0; 5793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *y = d; 5794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 5797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 5798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5799727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *x = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.x, CUR.F_dot_P ); 5800727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *y = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.y, CUR.F_dot_P ); 5801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return SUCCESS; 5804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Move_Zp2_Point( EXEC_OP_ FT_UShort point, 5809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 dx, 5810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 dy, 5811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool touch ) 5812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 5814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.face->unpatented_hinting ) 5815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.both_x_axis ) 5817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.cur[point].x += dx; 5819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( touch ) 5820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; 5821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 5823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.cur[point].y += dy; 5825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( touch ) 5826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; 5827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 5831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.freeVector.x != 0 ) 5833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.cur[point].x += dx; 5835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( touch ) 5836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; 5837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.freeVector.y != 0 ) 5840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.cur[point].y += dy; 5842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( touch ) 5843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; 5844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHP[a]: SHift Point by the last point */ 5851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x32-0x33 */ 5852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32... --> */ 5853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SHP( INS_ARG ) 5856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_GlyphZoneRec zp; 5858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort refp; 5859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 dx, 5861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dy; 5862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point; 5863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_ARG; 5865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.top < CUR.GS.loop ) 5868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5869aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( CUR.pedantic_hinting ) 5870727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5871aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner goto Fail; 5872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) 5875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( CUR.GS.loop > 0 ) 5878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.args--; 5880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point = (FT_UShort)CUR.stack[CUR.args]; 5881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( point, CUR.zp2.n_points ) ) 5883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5886727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 5891727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 5892727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* doesn't follow Cleartype spec but produces better result */ 5893727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 5894727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode ) 5895727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease MOVE_Zp2_Point( point, 0, dy, TRUE ); 5896727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 5897727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 5898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project MOVE_Zp2_Point( point, dx, dy, TRUE ); 5899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.loop--; 5901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5903aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner Fail: 5904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.loop = 1; 5905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top = CUR.args; 5906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHC[a]: SHift Contour */ 5912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x34-35 */ 5913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 5914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 591541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual) */ 591641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* contour in the twilight zone, namely contour number */ 5917727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* zero which includes all points of it. */ 591841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* */ 5919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SHC( INS_ARG ) 5921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 592241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier TT_GlyphZoneRec zp; 592341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_UShort refp; 592441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_F26Dot6 dx, dy; 5925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 592641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Short contour, bounds; 592741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_UShort start, limit, i; 5928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project contour = (FT_UShort)args[0]; 593141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier bounds = ( CUR.GS.gep2 == 0 ) ? 1 : CUR.zp2.n_contours; 5932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 593341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( BOUNDS( contour, bounds ) ) 5934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5936727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) 5941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( contour == 0 ) 594441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier start = 0; 5945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 594641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier start = (FT_UShort)( CUR.zp2.contours[contour - 1] + 1 - 594741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.zp2.first_point ); 5948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 594941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* we use the number of points if in the twilight zone */ 595041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( CUR.GS.gep2 == 0 ) 595141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier limit = CUR.zp2.n_points; 595241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier else 595341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier limit = (FT_UShort)( CUR.zp2.contours[contour] - 595441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.zp2.first_point + 1 ); 5955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 595641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier for ( i = start; i < limit; i++ ) 5957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( zp.cur != CUR.zp2.cur || refp != i ) 5959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project MOVE_Zp2_Point( i, dx, dy, TRUE ); 5960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 5965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHZ[a]: SHift Zone */ 5967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x36-37 */ 5968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 5969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 5970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 5971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SHZ( INS_ARG ) 5972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5973aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich TT_GlyphZoneRec zp; 5974aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_UShort refp; 5975aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_F26Dot6 dx, 5976aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich dy; 5977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 597841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_UShort limit, i; 5979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( args[0], 2 ) ) 5982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 5983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 5984727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 5985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 5987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 5988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) 5989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 5990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 599141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points. */ 599241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* Twilight zone has no real contours, so use `n_points'. */ 599341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* Normal zone's `n_points' includes phantoms, so must */ 599441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier /* use end of last contour. */ 599541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( CUR.GS.gep2 == 0 ) 599641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier limit = (FT_UShort)CUR.zp2.n_points; 5997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 ) 599841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier limit = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] + 1 ); 5999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 600041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier limit = 0; 6001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */ 600341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier for ( i = 0; i < limit; i++ ) 6004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( zp.cur != CUR.zp2.cur || refp != i ) 6006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project MOVE_Zp2_Point( i, dx, dy, FALSE ); 6007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 6012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHPIX[]: SHift points by a PIXel amount */ 6014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x38 */ 6015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 uint32... --> */ 6016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 6018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SHPIX( INS_ARG ) 6019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 dx, dy; 6021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point; 6022727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6023727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Int B1, B2; 6024727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 6025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.top < CUR.GS.loop + 1 ) 6028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6029aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( CUR.pedantic_hinting ) 6030727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6031aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner goto Fail; 6032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 6035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.face->unpatented_hinting ) 6036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.both_x_axis ) 6038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6039727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease dx = (FT_UInt32)args[0]; 6040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dy = 0; 6041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dx = 0; 6045727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease dy = (FT_UInt32)args[0]; 6046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 6050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6051295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x ); 6052295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y ); 6053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( CUR.GS.loop > 0 ) 6056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.args--; 6058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point = (FT_UShort)CUR.stack[CUR.args]; 6060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( point, CUR.zp2.n_points ) ) 6062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 6064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6065727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 6067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6070727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6071727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6072727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* If not using ignore_x_mode rendering, allow ZP2 move. */ 6073727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* If inline deltas aren't allowed, skip ZP2 move. */ 6074727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* If using ignore_x_mode rendering, allow ZP2 point move if: */ 6075727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* - freedom vector is y and sph_compatibility_mode is off */ 6076727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* - the glyph is composite and the move is in the Y direction */ 6077727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* - the glyph is specifically set to allow SHPIX moves */ 6078727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* - the move is on a previously Y-touched point */ 6079727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6080727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 6081727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode ) 6082727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6083727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* save point for later comparison */ 6084727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.GS.freeVector.y != 0 ) 6085727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B1 = CUR.zp2.cur[point].y; 6086727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 6087727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B1 = CUR.zp2.cur[point].x; 6088727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6089727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( !CUR.face->sph_compatibility_mode && 6090727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.y != 0 ) 6091727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6092727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease MOVE_Zp2_Point( point, dx, dy, TRUE ); 6093727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6094727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* save new point */ 6095727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.GS.freeVector.y != 0 ) 6096727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6097727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B2 = CUR.zp2.cur[point].y; 6098727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6099727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* reverse any disallowed moves */ 6100727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && 6101727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( B1 & 63 ) != 0 && 6102727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( B2 & 63 ) != 0 && 6103727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B1 != B2 ) 6104727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease MOVE_Zp2_Point( point, -dx, -dy, TRUE ); 6105727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6106727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6107727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else if ( CUR.face->sph_compatibility_mode ) 6108727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6109727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) 6110727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6111727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease dx = FT_PIX_ROUND( B1 + dx ) - B1; 6112727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease dy = FT_PIX_ROUND( B1 + dy ) - B1; 6113727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6114727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6115727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* skip post-iup deltas */ 6116727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.iup_called && 6117727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) || 6118727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) ) 6119727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease goto Skip; 6120727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6121727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) && 6122727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( ( CUR.is_composite && CUR.GS.freeVector.y != 0 ) || 6123727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) || 6124727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.sph_tweak_flags & SPH_TWEAK_DO_SHPIX ) ) ) 6125727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease MOVE_Zp2_Point( point, 0, dy, TRUE ); 6126727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6127727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* save new point */ 6128727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.GS.freeVector.y != 0 ) 6129727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6130727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B2 = CUR.zp2.cur[point].y; 6131727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6132727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* reverse any disallowed moves */ 6133727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( B1 & 63 ) == 0 && 6134727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( B2 & 63 ) != 0 && 6135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B1 != B2 ) 6136727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease MOVE_Zp2_Point( point, 0, -dy, TRUE ); 6137727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6138727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6139727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else if ( CUR.sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL ) 6140727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease MOVE_Zp2_Point( point, dx, dy, TRUE ); 6141727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6142727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 6143727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease MOVE_Zp2_Point( point, dx, dy, TRUE ); 6144727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6145727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6146727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease Skip: 6147727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6148727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6149727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project MOVE_Zp2_Point( point, dx, dy, TRUE ); 6151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6152727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6153727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.loop--; 6155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6157aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner Fail: 6158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.loop = 1; 6159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top = CUR.args; 6160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 6164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MSIRP[a]: Move Stack Indirect Relative Position */ 6166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x3A-0x3B */ 6167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: f26.6 uint32 --> */ 6168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 6170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MSIRP( INS_ARG ) 6171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point; 6173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 distance; 6174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6175727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6176727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_F26Dot6 control_value_cutin; 6177727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6178727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6179727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING ) 6180727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6181727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease control_value_cutin = CUR.GS.control_value_cutin; 6182727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6183727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.ignore_x_mode && 6184727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.x != 0 && 6185727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) 6186727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease control_value_cutin = 0; 6187727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6188727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6189727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point = (FT_UShort)args[0]; 6192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( point, CUR.zp1.n_points ) || 6194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) 6195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 6197727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 6199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6201aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* UNDOCUMENTED! The MS rasterizer does that with */ 6202aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* twilight points (confirmed by Greg Hitchcock) */ 6203aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( CUR.GS.gep1 == 0 ) 6204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0]; 6206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_move_orig( &CUR.zp1, point, args[1] ); 6207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp1.cur[point] = CUR.zp1.org[point]; 6208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project distance = CUR_Func_project( CUR.zp1.cur + point, 6211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0.cur + CUR.GS.rp0 ); 6212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6213727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6214727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* subpixel hinting - make MSIRP respect CVT cut-in; */ 6215727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 6216727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 6217727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.x != 0 && 6218727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ABS( distance - args[1] ) >= control_value_cutin ) 6219727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance = args[1]; 6220727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6221727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_move( &CUR.zp1, point, args[1] - distance ); 6223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp1 = CUR.GS.rp0; 6225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp2 = point; 6226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( CUR.opcode & 1 ) != 0 ) 6228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp0 = point; 6229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 6233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDAP[a]: Move Direct Absolute Point */ 6235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x2E-0x2F */ 6236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 6237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 6239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MDAP( INS_ARG ) 6240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point; 6242727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_F26Dot6 cur_dist; 6243727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_F26Dot6 distance; 6244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point = (FT_UShort)args[0]; 6247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( point, CUR.zp0.n_points ) ) 6249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 6251727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 6253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( CUR.opcode & 1 ) != 0 ) 6256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur_dist = CUR_fast_project( &CUR.zp0.cur[point] ); 6258727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6259727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 6260727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 6261727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.x != 0 ) 6262727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance = ROUND_None( 6263727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cur_dist, 6264727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.tt_metrics.compensations[0] ) - cur_dist; 6265727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 6266727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 6267727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance = CUR_Func_round( 6268727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cur_dist, 6269727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.tt_metrics.compensations[0] ) - cur_dist; 6270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project distance = 0; 6273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_move( &CUR.zp0, point, distance ); 6275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp0 = point; 6277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp1 = point; 6278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 6282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIAP[a]: Move Indirect Absolute Point */ 6284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x3E-0x3F */ 6285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32 --> */ 6286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 6288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MIAP( INS_ARG ) 6289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong cvtEntry; 6291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point; 6292727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_F26Dot6 distance; 6293727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_F26Dot6 org_dist; 6294727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_F26Dot6 control_value_cutin; 6295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6297727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease control_value_cutin = CUR.GS.control_value_cutin; 6298727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cvtEntry = (FT_ULong)args[1]; 6299727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease point = (FT_UShort)args[0]; 6300727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6301727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6302727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 6303727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 6304727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.x != 0 && 6305727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.y == 0 && 6306727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) 6307727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease control_value_cutin = 0; 6308727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6310aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDS( point, CUR.zp0.n_points ) || 6311aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich BOUNDSL( cvtEntry, CUR.cvtSize ) ) 6312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 6314727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6315aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner goto Fail; 6316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6318aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* UNDOCUMENTED! */ 6319aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* */ 6320aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* The behaviour of an MIAP instruction is quite different when used */ 6321aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* in the twilight zone. */ 6322aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* */ 6323aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* First, no control value cut-in test is performed as it would fail */ 6324aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* anyway. Second, the original point, i.e. (org_x,org_y) of */ 6325aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* zp0.point, is set to the absolute, unrounded distance found in the */ 6326aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* CVT. */ 6327aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* */ 6328aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* This is used in the CVT programs of the Microsoft fonts Arial, */ 6329aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Times, etc., in order to re-adjust some key font heights. It */ 6330aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* allows the use of the IP instruction in the twilight zone, which */ 6331aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* otherwise would be invalid according to the specification. */ 6332aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* */ 6333aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* We implement it with a special sequence for the twilight zone. */ 6334aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* This is a bad hack, but it seems to work. */ 6335aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* */ 6336aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* Confirmed by Greg Hitchcock. */ 6337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project distance = CUR_Func_read_cvt( cvtEntry ); 6339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.gep0 == 0 ) /* If in twilight zone */ 6341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6342727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6343727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */ 6344727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Determined via experimentation and may be incorrect... */ 6345727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( !SUBPIXEL_HINTING || 6346727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( !CUR.ignore_x_mode || 6347727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease !CUR.face->sph_compatibility_mode ) ) 6348727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6349727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance, 6350727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.x ); 6351aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance, 6352aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CUR.GS.freeVector.y ), 6353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0.cur[point] = CUR.zp0.org[point]; 6354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6355727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6356727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 6357727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 6358727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) && 6359727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance > 0 && 6360727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.y != 0 ) 6361727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance = 0; 6362727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org_dist = CUR_fast_project( &CUR.zp0.cur[point] ); 6365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6366727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( CUR.opcode & 1 ) != 0 ) /* rounding and control cut-in flag */ 6367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6368727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( FT_ABS( distance - org_dist ) > control_value_cutin ) 6369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project distance = org_dist; 6370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6371727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6372727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 6373727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 6374727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.x != 0 ) 6375727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance = ROUND_None( distance, 6376727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.tt_metrics.compensations[0] ); 6377727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 6378727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 6379727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance = CUR_Func_round( distance, 6380727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.tt_metrics.compensations[0] ); 6381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_move( &CUR.zp0, point, distance - org_dist ); 6384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6385aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner Fail: 6386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp0 = point; 6387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp1 = point; 6388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 6392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[abcde]: Move Direct Relative Point */ 6394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0xC0-0xDF */ 6395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 6396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 6398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MDRP( INS_ARG ) 6399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point; 6401727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_F26Dot6 org_dist, distance, minimum_distance; 6402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6404727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease minimum_distance = CUR.GS.minimum_distance; 6405727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6406727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6407727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 6408727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 6409727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.x != 0 && 6410727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) 6411727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease minimum_distance = 0; 6412727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6413727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point = (FT_UShort)args[0]; 6415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( point, CUR.zp1.n_points ) || 6417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) 6418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 6420727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6421aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner goto Fail; 6422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: Is there some undocumented feature while in the */ 6425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* twilight zone? */ 6426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: UNDOCUMENTED: twilight zone special case */ 6428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 ) 6430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* vec1 = &CUR.zp1.org[point]; 6432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* vec2 = &CUR.zp0.org[CUR.GS.rp0]; 6433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org_dist = CUR_Func_dualproj( vec1, vec2 ); 6436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* vec1 = &CUR.zp1.orus[point]; 6440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* vec2 = &CUR.zp0.orus[CUR.GS.rp0]; 6441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) 6444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* this should be faster */ 6446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org_dist = CUR_Func_dualproj( vec1, vec2 ); 6447727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease org_dist = FT_MulFix( org_dist, CUR.metrics.x_scale ); 6448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector vec; 6452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6454727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale ); 6455727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale ); 6456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org_dist = CUR_fast_dualproj( &vec ); 6458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* single width cut-in test */ 6462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_ABS( org_dist - CUR.GS.single_width_value ) < 6464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.single_width_cutin ) 6465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( org_dist >= 0 ) 6467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org_dist = CUR.GS.single_width_value; 6468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org_dist = -CUR.GS.single_width_value; 6470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* round flag */ 6473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( CUR.opcode & 4 ) != 0 ) 6475727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6476727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6477727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 6478727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 6479727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.x != 0 ) 6480727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance = ROUND_None( 6481727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease org_dist, 6482727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.tt_metrics.compensations[CUR.opcode & 3] ); 6483727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 6484727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif 6485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project distance = CUR_Func_round( 6486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org_dist, 6487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.compensations[CUR.opcode & 3] ); 6488727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project distance = ROUND_None( 6491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org_dist, 6492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.compensations[CUR.opcode & 3] ); 6493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* minimum distance flag */ 6495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( CUR.opcode & 8 ) != 0 ) 6497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( org_dist >= 0 ) 6499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6500727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( distance < minimum_distance ) 6501727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance = minimum_distance; 6502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6505727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( distance > -minimum_distance ) 6506727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance = -minimum_distance; 6507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now move the point */ 6511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org_dist = CUR_Func_project( CUR.zp1.cur + point, 6513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0.cur + CUR.GS.rp0 ); 6514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_move( &CUR.zp1, point, distance - org_dist ); 6516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6517aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner Fail: 6518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp1 = CUR.GS.rp0; 6519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp2 = point; 6520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( CUR.opcode & 16 ) != 0 ) 6522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp0 = point; 6523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 6527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[abcde]: Move Indirect Relative Point */ 6529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0xE0-0xFF */ 6530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: int32? uint32 --> */ 6531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 6533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MIRP( INS_ARG ) 6534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point; 6536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong cvtEntry; 6537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 cvt_dist, 6539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project distance, 6540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur_dist, 6541727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease org_dist, 6542727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease control_value_cutin, 6543727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease minimum_distance; 6544727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6545727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Int B1; 6546727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Int B2; 6547727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Bool reverse_move = FALSE; 6548727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6549727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6550727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6551727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease minimum_distance = CUR.GS.minimum_distance; 6552727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease control_value_cutin = CUR.GS.control_value_cutin; 6553727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease point = (FT_UShort)args[0]; 6554727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cvtEntry = (FT_ULong)( args[1] + 1 ); 6555727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6556727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6557727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 6558727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 6559727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.x != 0 && 6560727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) 6561727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease control_value_cutin = minimum_distance = 0; 6562727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */ 6565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( point, CUR.zp1.n_points ) || 6567aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich BOUNDSL( cvtEntry, CUR.cvtSize + 1 ) || 6568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) 6569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 6571727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6572aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner goto Fail; 6573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !cvtEntry ) 6576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cvt_dist = 0; 6577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 ); 6579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* single width test */ 6581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) < 6583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.single_width_cutin ) 6584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cvt_dist >= 0 ) 6586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cvt_dist = CUR.GS.single_width_value; 6587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cvt_dist = -CUR.GS.single_width_value; 6589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6591aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* UNDOCUMENTED! The MS rasterizer does that with */ 6592aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* twilight points (confirmed by Greg Hitchcock) */ 6593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.gep1 == 0 ) 6594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x + 6596295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner TT_MulFix14( (FT_UInt32)cvt_dist, 6597295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner CUR.GS.freeVector.x ); 6598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y + 6599295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner TT_MulFix14( (FT_UInt32)cvt_dist, 6600295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner CUR.GS.freeVector.y ); 660141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.zp1.cur[point] = CUR.zp1.org[point]; 6602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org_dist = CUR_Func_dualproj( &CUR.zp1.org[point], 6605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &CUR.zp0.org[CUR.GS.rp0] ); 6606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur_dist = CUR_Func_project ( &CUR.zp1.cur[point], 6607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project &CUR.zp0.cur[CUR.GS.rp0] ); 6608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* auto-flip test */ 6610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.auto_flip ) 6612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( org_dist ^ cvt_dist ) < 0 ) 6614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cvt_dist = -cvt_dist; 6615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6617727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6618727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 6619727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 6620727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.y != 0 && 6621727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) ) 6622727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6623727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( cur_dist < -64 ) 6624727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cvt_dist -= 16; 6625727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else if ( cur_dist > 64 && cur_dist < 84 ) 6626727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cvt_dist += 32; 6627727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6628727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6629727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6630727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* control value cut-in and round */ 6631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( CUR.opcode & 4 ) != 0 ) 6633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: UNDOCUMENTED! Only perform cut-in test when both points */ 6635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* refer to the same zone. */ 6636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.gep0 == CUR.GS.gep1 ) 6638aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 6639aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* XXX: According to Greg Hitchcock, the following wording is */ 6640aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* the right one: */ 6641aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* */ 6642aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* When the absolute difference between the value in */ 6643aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* the table [CVT] and the measurement directly from */ 6644aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* the outline is _greater_ than the cut_in value, the */ 6645aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* outline measurement is used. */ 6646aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* */ 6647aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* This is from `instgly.doc'. The description in */ 6648aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* `ttinst2.doc', version 1.66, is thus incorrect since */ 6649aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* it implies `>=' instead of `>'. */ 6650aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 6651727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin ) 6652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cvt_dist = org_dist; 6653aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 6654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project distance = CUR_Func_round( 6656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cvt_dist, 6657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.compensations[CUR.opcode & 3] ); 6658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6660727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6661727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6662727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6663727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* do cvt cut-in always in MIRP for sph */ 6664727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 6665727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 6666727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.gep0 == CUR.GS.gep1 ) 6667727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6668727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin ) 6669727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cvt_dist = org_dist; 6670727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6671727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6672727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project distance = ROUND_None( 6674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cvt_dist, 6675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.compensations[CUR.opcode & 3] ); 6676727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* minimum distance test */ 6679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( CUR.opcode & 8 ) != 0 ) 6681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( org_dist >= 0 ) 6683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6684727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( distance < minimum_distance ) 6685727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance = minimum_distance; 6686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6689727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( distance > -minimum_distance ) 6690727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance = -minimum_distance; 6691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6694727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6695727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING ) 6696727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6697727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B1 = CUR.zp1.cur[point].y; 6698727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6699727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Round moves if necessary */ 6700727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.ignore_x_mode && 6701727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.y != 0 && 6702727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) ) 6703727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist; 6704727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6705727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.ignore_x_mode && 6706727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.y != 0 && 6707727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.opcode & 16 ) == 0 && 6708727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.opcode & 8 ) == 0 && 6709727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) ) 6710727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease distance += 64; 6711727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6712727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6713727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_move( &CUR.zp1, point, distance - cur_dist ); 6715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6716727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6717727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING ) 6718727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6719727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B2 = CUR.zp1.cur[point].y; 6720727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6721727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Reverse move if necessary */ 6722727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.ignore_x_mode ) 6723727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6724727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.face->sph_compatibility_mode && 6725727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.y != 0 && 6726727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( B1 & 63 ) == 0 && 6727727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( B2 & 63 ) != 0 ) 6728727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease reverse_move = TRUE; 6729727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6730727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && 6731727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.y != 0 && 6732727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( B2 & 63 ) != 0 && 6733727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( B1 & 63 ) != 0 ) 6734727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease reverse_move = TRUE; 6735727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6736727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6737727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( reverse_move ) 6738727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR_Func_move( &CUR.zp1, point, -( distance - cur_dist ) ); 6739727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6740727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6741727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6742727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6743aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner Fail: 6744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp1 = CUR.GS.rp0; 6745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( CUR.opcode & 16 ) != 0 ) 6747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp0 = point; 6748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.rp2 = point; 6750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 6754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ALIGNRP[]: ALIGN Relative Point */ 6756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x3C */ 6757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32... --> */ 6758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 6760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ALIGNRP( INS_ARG ) 6761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point; 6763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 distance; 6764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_ARG; 6766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6768727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 6769727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 6770727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 6771727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.iup_called && 6772727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) ) 6773727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 6774727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6775727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease goto Fail; 6776727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 6777727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 6778727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.top < CUR.GS.loop || 6780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) 6781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 6783727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6784aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner goto Fail; 6785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( CUR.GS.loop > 0 ) 6788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.args--; 6790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point = (FT_UShort)CUR.stack[CUR.args]; 6792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( point, CUR.zp1.n_points ) ) 6794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 6796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6797727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 6799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project distance = CUR_Func_project( CUR.zp1.cur + point, 6804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0.cur + CUR.GS.rp0 ); 6805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_move( &CUR.zp1, point, -distance ); 6807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.loop--; 6810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6812aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner Fail: 6813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.loop = 1; 6814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top = CUR.args; 6815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 6819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ISECT[]: moves point to InterSECTion */ 6821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x0F */ 6822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: 5 * uint32 --> */ 6823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 6825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ISECT( INS_ARG ) 6826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point, 6828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project a0, a1, 6829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project b0, b1; 6830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6831727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_F26Dot6 discriminant, dotproduct; 6832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 dx, dy, 6834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dax, day, 6835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dbx, dby; 6836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 val; 6838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector R; 6840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point = (FT_UShort)args[0]; 6843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project a0 = (FT_UShort)args[1]; 6845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project a1 = (FT_UShort)args[2]; 6846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project b0 = (FT_UShort)args[3]; 6847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project b1 = (FT_UShort)args[4]; 6848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( b0, CUR.zp0.n_points ) || 6850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( b1, CUR.zp0.n_points ) || 6851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( a0, CUR.zp1.n_points ) || 6852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( a1, CUR.zp1.n_points ) || 6853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( point, CUR.zp2.n_points ) ) 6854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 6856727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 6858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6860727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Cramer's rule */ 6861727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x; 6863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y; 6864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x; 6866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y; 6867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x; 6869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y; 6870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH; 6872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6873727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease discriminant = FT_MulDiv( dax, -dby, 0x40 ) + 6874727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_MulDiv( day, dbx, 0x40 ); 6875727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease dotproduct = FT_MulDiv( dax, dbx, 0x40 ) + 6876727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_MulDiv( day, dby, 0x40 ); 6877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6878727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* The discriminant above is actually a cross product of vectors */ 6879727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* da and db. Together with the dot product, they can be used as */ 6880727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* surrogates for sine and cosine of the angle between the vectors. */ 6881727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Indeed, */ 6882727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* dotproduct = |da||db|cos(angle) */ 6883727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* discriminant = |da||db|sin(angle) . */ 6884727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* We use these equations to reject grazing intersections by */ 6885727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */ 6886727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( 19 * FT_ABS( discriminant ) > FT_ABS( dotproduct ) ) 6887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6888727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease val = FT_MulDiv( dx, -dby, 0x40 ) + FT_MulDiv( dy, dbx, 0x40 ); 6889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6890727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease R.x = FT_MulDiv( val, dax, discriminant ); 6891727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease R.y = FT_MulDiv( val, day, discriminant ); 6892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x; 6894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y; 6895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* else, take the middle of the middles of A and B */ 6899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x + 6901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp1.cur[a1].x + 6902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0.cur[b0].x + 6903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0.cur[b1].x ) / 4; 6904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y + 6905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp1.cur[a1].y + 6906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0.cur[b0].y + 6907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0.cur[b1].y ) / 4; 6908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 6913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ALIGNPTS[]: ALIGN PoinTS */ 6915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x27 */ 6916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 uint32 --> */ 6917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 6919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ALIGNPTS( INS_ARG ) 6920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort p1, p2; 6922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 distance; 6923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p1 = (FT_UShort)args[0]; 6926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p2 = (FT_UShort)args[1]; 6927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6928aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDS( p1, CUR.zp1.n_points ) || 6929aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich BOUNDS( p2, CUR.zp0.n_points ) ) 6930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 6932727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 6934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project distance = CUR_Func_project( CUR.zp0.cur + p2, 6937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp1.cur + p1 ) / 2; 6938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_move( &CUR.zp1, p1, distance ); 6940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_move( &CUR.zp0, p2, -distance ); 6941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 6945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IP[]: Interpolate Point */ 6947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x39 */ 6948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32... --> */ 6949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 6950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SOMETIMES, DUMBER CODE IS BETTER CODE */ 6952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 6954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_IP( INS_ARG ) 6955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 old_range, cur_range; 6957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* orus_base; 6958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* cur_base; 6959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int twilight; 6960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_ARG; 6962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.top < CUR.GS.loop ) 6965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6966aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( CUR.pedantic_hinting ) 6967727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6968aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner goto Fail; 6969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* 6972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * We need to deal in a special way with the twilight zone. 6973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0), 6974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * for every n. 6975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */ 6976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0; 6977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ) 6979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 6981727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 6982aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner goto Fail; 6983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 6984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( twilight ) 6986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project orus_base = &CUR.zp0.org[CUR.GS.rp1]; 6987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 6988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project orus_base = &CUR.zp0.orus[CUR.GS.rp1]; 6989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur_base = &CUR.zp0.cur[CUR.GS.rp1]; 6991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 6992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: There are some glyphs in some braindead but popular */ 6993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* fonts out there (e.g. [aeu]grave in monotype.ttf) */ 6994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* calling IP[] with bad values of rp[12]. */ 6995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Do something sane when this odd thing happens. */ 6996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) || 6997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) ) 6998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 6999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project old_range = 0; 7000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur_range = 0; 7001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 7003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( twilight ) 7005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2], 7006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project orus_base ); 700741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier else if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) 7008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2], 7009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project orus_base ); 701041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier else 701141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier { 701241371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Vector vec; 701341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 701441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 7015727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease vec.x = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].x - orus_base->x, 701641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.metrics.x_scale ); 7017727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease vec.y = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].y - orus_base->y, 701841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.metrics.y_scale ); 701941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 702041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier old_range = CUR_fast_dualproj( &vec ); 702141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier } 7022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base ); 7024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; CUR.GS.loop > 0; --CUR.GS.loop ) 7027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt point = (FT_UInt)CUR.stack[--CUR.args]; 7029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 org_dist, cur_dist, new_dist; 7030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check point bounds */ 7033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( point, CUR.zp2.n_points ) ) 7034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 7036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7037727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 7038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 7039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project continue; 7041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( twilight ) 7044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base ); 704541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier else if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) 7046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base ); 704741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier else 704841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier { 704941371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier FT_Vector vec; 705041371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 705141371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 7052727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease vec.x = FT_MulFix( CUR.zp2.orus[point].x - orus_base->x, 705341371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.metrics.x_scale ); 7054727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease vec.y = FT_MulFix( CUR.zp2.orus[point].y - orus_base->y, 705541371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier CUR.metrics.y_scale ); 705641371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier 705741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier org_dist = CUR_fast_dualproj( &vec ); 705841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier } 7059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base ); 7061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( org_dist ) 7063727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 7064727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( old_range ) 7065727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease new_dist = FT_MulDiv( org_dist, cur_range, old_range ); 7066727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 7067727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 7068727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* This is the same as what MS does for the invalid case: */ 7069727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7070727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* delta = (Original_Pt - Original_RP1) - */ 7071727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* (Current_Pt - Current_RP1) */ 7072727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7073727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* In FreeType speak: */ 7074727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7075727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* new_dist = cur_dist - */ 7076727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* org_dist - cur_dist; */ 7077727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7078727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease new_dist = -org_dist; 7079727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 7080727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 7081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 7082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_dist = 0; 7083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist ); 7085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7086aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 7087aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner Fail: 7088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.loop = 1; 7089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top = CUR.args; 7090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 7094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 7095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* UTP[a]: UnTouch Point */ 7096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x29 */ 7097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> */ 7098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 7099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 7100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_UTP( INS_ARG ) 7101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort point; 7103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte mask; 7104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point = (FT_UShort)args[0]; 7107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( point, CUR.zp0.n_points ) ) 7109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 7111727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 7112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 7113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask = 0xFF; 7116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.freeVector.x != 0 ) 7118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask &= ~FT_CURVE_TAG_TOUCH_X; 7119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.GS.freeVector.y != 0 ) 7121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask &= ~FT_CURVE_TAG_TOUCH_Y; 7122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.zp0.tags[point] &= mask; 7124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Local variables for Ins_IUP: */ 7128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project typedef struct IUP_WorkerRec_ 7129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* orgs; /* original and current coordinate */ 7131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* curs; /* arrays */ 7132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Vector* orus; 7133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt max_points; 7134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } IUP_WorkerRec, *IUP_Worker; 7136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 7139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project _iup_worker_shift( IUP_Worker worker, 7140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt p1, 7141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt p2, 7142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt p ) 7143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt i; 7145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 dx; 7146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dx = worker->curs[p].x - worker->orgs[p].x; 7149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dx != 0 ) 7150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = p1; i < p; i++ ) 7152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project worker->curs[i].x += dx; 7153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = p + 1; i <= p2; i++ ) 7155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project worker->curs[i].x += dx; 7156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 7161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project _iup_worker_interpolate( IUP_Worker worker, 7162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt p1, 7163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt p2, 7164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt ref1, 7165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt ref2 ) 7166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt i; 7168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 orus1, orus2, org1, org2, delta1, delta2; 7169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p1 > p2 ) 7172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 7173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( BOUNDS( ref1, worker->max_points ) || 7175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BOUNDS( ref2, worker->max_points ) ) 7176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 7177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project orus1 = worker->orus[ref1].x; 7179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project orus2 = worker->orus[ref2].x; 7180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( orus1 > orus2 ) 7182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 tmp_o; 7184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt tmp_r; 7185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tmp_o = orus1; 7188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project orus1 = orus2; 7189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project orus2 = tmp_o; 7190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project tmp_r = ref1; 7192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ref1 = ref2; 7193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ref2 = tmp_r; 7194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org1 = worker->orgs[ref1].x; 7197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project org2 = worker->orgs[ref2].x; 7198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project delta1 = worker->curs[ref1].x - org1; 7199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project delta2 = worker->curs[ref2].x - org2; 7200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( orus1 == orus2 ) 7202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* simple shift of untouched points */ 7204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = p1; i <= p2; i++ ) 7205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 x = worker->orgs[i].x; 7207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( x <= org1 ) 7210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x += delta1; 7211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 7212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x += delta2; 7213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project worker->curs[i].x = x; 7215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 7218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Fixed scale = 0; 7220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Bool scale_valid = 0; 7221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* interpolation */ 7224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( i = p1; i <= p2; i++ ) 7225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_F26Dot6 x = worker->orgs[i].x; 7227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( x <= org1 ) 7230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x += delta1; 7231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( x >= org2 ) 7233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x += delta2; 7234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 7236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !scale_valid ) 7238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project scale_valid = 1; 7240727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease scale = FT_DivFix( org2 + delta2 - ( org1 + delta1 ), 7241727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease orus2 - orus1 ); 7242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project x = ( org1 + delta1 ) + 7245727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_MulFix( worker->orus[i].x - orus1, scale ); 7246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project worker->curs[i].x = x; 7248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 7254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 7255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IUP[a]: Interpolate Untouched Points */ 7256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x30-0x31 */ 7257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: --> */ 7258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 7259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 7260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_IUP( INS_ARG ) 7261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project IUP_WorkerRec V; 7263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte mask; 7264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt first_point; /* first point of contour */ 7266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt end_point; /* end point (last+1) of contour */ 7267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt first_touched; /* first touched point in contour */ 7269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt cur_touched; /* current touched point in contour */ 7270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt point; /* current point */ 7272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Short contour; /* current contour */ 7273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_ARG; 7275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ignore empty outlines */ 7278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pts.n_contours == 0 ) 7279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 7280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.opcode & 1 ) 7282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask = FT_CURVE_TAG_TOUCH_X; 7284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project V.orgs = CUR.pts.org; 7285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project V.curs = CUR.pts.cur; 7286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project V.orus = CUR.pts.orus; 7287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 7289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask = FT_CURVE_TAG_TOUCH_Y; 7291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 ); 7292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 ); 7293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 ); 7294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project V.max_points = CUR.pts.n_points; 7296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project contour = 0; 7298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point = 0; 7299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7300727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 7301727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 7302727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode ) 7303727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 7304727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.iup_called = TRUE; 7305727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_IUP ) 7306727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return; 7307727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 7308727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 7309727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project do 7311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project end_point = CUR.pts.contours[contour] - CUR.pts.first_point; 7313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first_point = point; 7314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7315aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDS ( end_point, CUR.pts.n_points ) ) 7316aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich end_point = CUR.pts.n_points - 1; 7317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 ) 7319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point++; 7320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( point <= end_point ) 7322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first_touched = point; 7324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur_touched = point; 7325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point++; 7327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( point <= end_point ) 7329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( CUR.pts.tags[point] & mask ) != 0 ) 7331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 73327f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner _iup_worker_interpolate( &V, 73337f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner cur_touched + 1, 73347f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner point - 1, 73357f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner cur_touched, 73367f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner point ); 7337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur_touched = point; 7338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project point++; 7341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( cur_touched == first_touched ) 7344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project _iup_worker_shift( &V, first_point, end_point, cur_touched ); 7345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 7346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project _iup_worker_interpolate( &V, 7348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project (FT_UShort)( cur_touched + 1 ), 7349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project end_point, 7350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur_touched, 7351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first_touched ); 7352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( first_touched > 0 ) 7354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project _iup_worker_interpolate( &V, 7355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first_point, 7356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first_touched - 1, 7357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur_touched, 7358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project first_touched ); 7359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project contour++; 7362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } while ( contour < CUR.pts.n_contours ); 7363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 7367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 7368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DELTAPn[]: DELTA exceptions P1, P2, P3 */ 7369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x5D,0x71,0x72 */ 7370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 (2 * uint32)... --> */ 7371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 7372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 7373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_DELTAP( INS_ARG ) 7374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong k, nump; 7376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UShort A; 7377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong C; 7378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long B; 7379727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 7380727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_UShort B1, B2; 7381727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7382727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7383727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 7384727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 7385727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.iup_called && 7386727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) ) 7387727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease goto Fail; 7388727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 7389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 7392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Delta hinting is covered by US Patent 5159668. */ 7393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.face->unpatented_hinting ) 7394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long n = args[0] * 2; 7396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.args < n ) 7399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7400aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( CUR.pedantic_hinting ) 7401727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Too_Few_Arguments ); 7402aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner n = CUR.args; 7403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.args -= n; 7406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top = CUR.args; 7407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 7408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 7410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project nump = (FT_ULong)args[0]; /* some points theoretically may occur more 7412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project than once, thus UShort isn't enough */ 7413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( k = 1; k <= nump; k++ ) 7415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.args < 2 ) 7417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7418aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( CUR.pedantic_hinting ) 7419727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Too_Few_Arguments ); 7420aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CUR.args = 0; 7421aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner goto Fail; 7422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.args -= 2; 7425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = (FT_UShort)CUR.stack[CUR.args + 1]; 7427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = CUR.stack[CUR.args]; 7428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* XXX: Because some popular fonts contain some invalid DeltaP */ 7430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* instructions, we simply ignore them when the stacked */ 7431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* point reference is off limit, rather than returning an */ 7432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* error. As a delta instruction doesn't change a glyph */ 7433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* in great ways, this shouldn't be a problem. */ 7434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !BOUNDS( A, CUR.zp0.n_points ) ) 7436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C = ( (FT_ULong)B & 0xF0 ) >> 4; 7438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( CUR.opcode ) 7440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x5D: 7442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 7443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x71: 7445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C += 16; 7446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 7447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x72: 7449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C += 32; 7450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 7451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C += CUR.GS.delta_base; 7454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CURRENT_Ppem() == (FT_Long)C ) 7456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = ( (FT_ULong)B & 0xF ) - 8; 7458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( B >= 0 ) 7459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B++; 7460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = B * 64 / ( 1L << CUR.GS.delta_shift ); 7461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7462727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 7463727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7464727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING ) 7465727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 7466727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* 7467727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease * Allow delta move if 7468727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease * 7469727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease * - not using ignore_x_mode rendering 7470727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease * - glyph is specifically set to allow it 7471727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease * - glyph is composite and freedom vector is not subpixel 7472727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease * vector 7473727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease */ 7474727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( !CUR.ignore_x_mode || 7475727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) || 7476727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.is_composite && CUR.GS.freeVector.y != 0 ) ) 7477727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR_Func_move( &CUR.zp0, A, B ); 7478727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7479727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Otherwise apply subpixel hinting and */ 7480727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* compatibility mode rules */ 7481727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else if ( CUR.ignore_x_mode ) 7482727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 7483727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.GS.freeVector.y != 0 ) 7484727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B1 = CUR.zp0.cur[A].y; 7485727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 7486727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B1 = CUR.zp0.cur[A].x; 7487727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7488727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#if 0 7489727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Standard Subpixel Hinting: Allow y move. */ 7490727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* This messes up dejavu and may not be needed... */ 7491727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( !CUR.face->sph_compatibility_mode && 7492727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.GS.freeVector.y != 0 ) 7493727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR_Func_move( &CUR.zp0, A, B ); 7494727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 7495727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* 0 */ 7496727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7497727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Compatibility Mode: Allow x or y move if point touched in */ 7498727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Y direction. */ 7499727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.face->sph_compatibility_mode && 7500727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) ) 7501727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 7502727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* save the y value of the point now; compare after move */ 7503727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B1 = CUR.zp0.cur[A].y; 7504727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7505727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) 7506727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B = FT_PIX_ROUND( B1 + B ) - B1; 7507727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7508727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Allow delta move if using sph_compatibility_mode, */ 7509727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* IUP has not been called, and point is touched on Y. */ 7510727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( !CUR.iup_called && 7511727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( CUR.zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) 7512727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR_Func_move( &CUR.zp0, A, B ); 7513727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 7514727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7515727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease B2 = CUR.zp0.cur[A].y; 7516727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7517727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Reverse this move if it results in a disallowed move */ 7518727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.GS.freeVector.y != 0 && 7519727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( ( CUR.face->sph_compatibility_mode && 7520727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( B1 & 63 ) == 0 && 7521727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( B2 & 63 ) != 0 ) || 7522727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( ( CUR.sph_tweak_flags & 7523727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) && 7524727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( B1 & 63 ) != 0 && 7525727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( B2 & 63 ) != 0 ) ) ) 7526727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR_Func_move( &CUR.zp0, A, -B ); 7527727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 7528727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 7529727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 7530727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 7531727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7532727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR_Func_move( &CUR.zp0, A, B ); 7533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 7536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 7537727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 7538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7540aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner Fail: 7541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top = CUR.args; 7542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 7546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 7547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DELTACn[]: DELTA exceptions C1, C2, C3 */ 7548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x73,0x74,0x75 */ 7549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 (2 * uint32)... --> */ 7550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 7551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 7552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_DELTAC( INS_ARG ) 7553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong nump, k; 7555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ULong A, C; 7556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long B; 7557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING 7560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Delta hinting is covered by US Patent 5159668. */ 7561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.face->unpatented_hinting ) 7562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long n = args[0] * 2; 7564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.args < n ) 7567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7568aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( CUR.pedantic_hinting ) 7569727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Too_Few_Arguments ); 7570aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner n = CUR.args; 7571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.args -= n; 7574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top = CUR.args; 7575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 7576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 7578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project nump = (FT_ULong)args[0]; 7580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( k = 1; k <= nump; k++ ) 7582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.args < 2 ) 7584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7585aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( CUR.pedantic_hinting ) 7586727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Too_Few_Arguments ); 7587aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CUR.args = 0; 7588aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner goto Fail; 7589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.args -= 2; 7592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project A = (FT_ULong)CUR.stack[CUR.args + 1]; 7594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = CUR.stack[CUR.args]; 7595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7596aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich if ( BOUNDSL( A, CUR.cvtSize ) ) 7597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.pedantic_hinting ) 7599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7600727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 7601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 7602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 7605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C = ( (FT_ULong)B & 0xF0 ) >> 4; 7607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( CUR.opcode ) 7609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x73: 7611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 7612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x74: 7614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C += 16; 7615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 7616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x75: 7618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C += 32; 7619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 7620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project C += CUR.GS.delta_base; 7623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CURRENT_Ppem() == (FT_Long)C ) 7625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = ( (FT_ULong)B & 0xF ) - 8; 7627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( B >= 0 ) 7628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B++; 7629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project B = B * 64 / ( 1L << CUR.GS.delta_shift ); 7630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR_Func_move_cvt( A, B ); 7632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7636aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner Fail: 7637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top = CUR.args; 7638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 7642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 7643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MISC. INSTRUCTIONS */ 7644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 7645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 7646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 7649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 7650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GETINFO[]: GET INFOrmation */ 7651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcode range: 0x88 */ 7652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Stack: uint32 --> uint32 */ 7653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 7654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 7655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_GETINFO( INS_ARG ) 7656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long K; 7658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project K = 0; 7661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7662727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 7663727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /********************************/ 7664727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* RASTERIZER VERSION */ 7665727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Selector Bit: 0 */ 7666727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Return Bit(s): 0-7 */ 7667727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7668727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 7669727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease ( args[0] & 1 ) != 0 && 7670727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode ) 7671727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 7672727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease K = CUR.rasterizer_version; 7673727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_TRACE7(( "Setting rasterizer version %d\n", 7674727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.rasterizer_version )); 7675727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 7676727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 7677727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 7678727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( args[0] & 1 ) != 0 ) 7679727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease K = TT_INTERPRETER_VERSION_35; 7680727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7681727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /********************************/ 7682727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* GLYPH ROTATED */ 7683727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Selector Bit: 1 */ 7684727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Return Bit(s): 8 */ 7685727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated ) 7687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project K |= 0x80; 7688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7689727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /********************************/ 7690727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* GLYPH STRETCHED */ 7691727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Selector Bit: 2 */ 7692727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Return Bit(s): 9 */ 7693727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched ) 7695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project K |= 1 << 8; 7696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7697727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /********************************/ 7698727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* HINTING FOR GRAYSCALE */ 7699727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Selector Bit: 5 */ 7700727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Return Bit(s): 12 */ 7701727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( args[0] & 32 ) != 0 && CUR.grayscale ) 7703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project K |= 1 << 12; 7704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7705727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 7706727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7707727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING && 7708727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.ignore_x_mode && 7709727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.rasterizer_version >= TT_INTERPRETER_VERSION_35 ) 7710727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 7711727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /********************************/ 7712727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* HINTING FOR GRAYSCALE */ 7713727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Selector Bit: 5 */ 7714727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Return Bit(s): 12 */ 7715727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7716727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( args[0] & 32 ) != 0 && CUR.grayscale_hinting ) 7717727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease K |= 1 << 12; 7718727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7719727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /********************************/ 7720727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* HINTING FOR SUBPIXEL */ 7721727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Selector Bit: 6 */ 7722727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Return Bit(s): 13 */ 7723727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7724727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( args[0] & 64 ) != 0 && 7725727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.subpixel_hinting && 7726727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.rasterizer_version >= 37 ) 7727727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 7728727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease K |= 1 << 13; 7729727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7730727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* the stuff below is irrelevant if subpixel_hinting is not set */ 7731727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7732727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /********************************/ 7733727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* COMPATIBLE WIDTHS ENABLED */ 7734727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Selector Bit: 7 */ 7735727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Return Bit(s): 14 */ 7736727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7737727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Functionality still needs to be added */ 7738727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( args[0] & 128 ) != 0 && CUR.compatible_widths ) 7739727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease K |= 1 << 14; 7740727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7741727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /********************************/ 7742727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* SYMMETRICAL SMOOTHING */ 7743727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Selector Bit: 8 */ 7744727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Return Bit(s): 15 */ 7745727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7746727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Functionality still needs to be added */ 7747727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( args[0] & 256 ) != 0 && CUR.symmetrical_smoothing ) 7748727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease K |= 1 << 15; 7749727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7750727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /********************************/ 7751727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* HINTING FOR BGR? */ 7752727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Selector Bit: 9 */ 7753727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Return Bit(s): 16 */ 7754727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7755727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Functionality still needs to be added */ 7756727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( args[0] & 512 ) != 0 && CUR.bgr ) 7757727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease K |= 1 << 16; 7758727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7759727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.rasterizer_version >= 38 ) 7760727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 7761727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /********************************/ 7762727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* SUBPIXEL POSITIONED? */ 7763727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Selector Bit: 10 */ 7764727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Return Bit(s): 17 */ 7765727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 7766727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Functionality still needs to be added */ 7767727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( ( args[0] & 1024 ) != 0 && CUR.subpixel_positioned ) 7768727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease K |= 1 << 17; 7769727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 7770727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 7771727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 7772727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7773727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 7774727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 7775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project args[0] = K; 7776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 7780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_UNKNOWN( INS_ARG ) 7781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DefRecord* def = CUR.IDefs; 7783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DefRecord* limit = def + CUR.numIDefs; 7784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UNUSED_ARG; 7786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; def < limit; def++ ) 7789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( (FT_Byte)def->opc == CUR.opcode && def->active ) 7791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_CallRec* call; 7793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.callTop >= CUR.callSize ) 7796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7797727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Stack_Overflow ); 7798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 7799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project call = CUR.callStack + CUR.callTop++; 7802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project call->Caller_Range = CUR.curRange; 7804aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich call->Caller_IP = CUR.IP + 1; 7805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project call->Cur_Count = 1; 7806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project call->Cur_Restart = def->start; 780741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier call->Cur_End = def->end; 7808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project INS_Goto_CodeRange( def->range, def->start ); 7810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.step_ins = FALSE; 7812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 7813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7816727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Opcode ); 7817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 7818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH 7821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static 7824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TInstruction_Function Instruct_Dispatch[256] = 7825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 7826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Opcodes are gathered in groups of 16. */ 7827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Please keep the spaces as they are. */ 7828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SVTCA y */ Ins_SVTCA, 7830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SVTCA x */ Ins_SVTCA, 7831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPvTCA y */ Ins_SPVTCA, 7832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPvTCA x */ Ins_SPVTCA, 7833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFvTCA y */ Ins_SFVTCA, 7834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFvTCA x */ Ins_SFVTCA, 7835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPvTL // */ Ins_SPVTL, 7836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPvTL + */ Ins_SPVTL, 7837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFvTL // */ Ins_SFVTL, 7838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFvTL + */ Ins_SFVTL, 7839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SPvFS */ Ins_SPVFS, 7840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFvFS */ Ins_SFVFS, 7841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GPV */ Ins_GPV, 7842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GFV */ Ins_GFV, 7843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SFvTPv */ Ins_SFVTPV, 7844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ISECT */ Ins_ISECT, 7845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SRP0 */ Ins_SRP0, 7847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SRP1 */ Ins_SRP1, 7848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SRP2 */ Ins_SRP2, 7849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SZP0 */ Ins_SZP0, 7850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SZP1 */ Ins_SZP1, 7851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SZP2 */ Ins_SZP2, 7852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SZPS */ Ins_SZPS, 7853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SLOOP */ Ins_SLOOP, 7854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RTG */ Ins_RTG, 7855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RTHG */ Ins_RTHG, 7856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SMD */ Ins_SMD, 7857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ELSE */ Ins_ELSE, 7858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* JMPR */ Ins_JMPR, 7859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SCvTCi */ Ins_SCVTCI, 7860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SSwCi */ Ins_SSWCI, 7861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SSW */ Ins_SSW, 7862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DUP */ Ins_DUP, 7864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* POP */ Ins_POP, 7865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CLEAR */ Ins_CLEAR, 7866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SWAP */ Ins_SWAP, 7867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DEPTH */ Ins_DEPTH, 7868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CINDEX */ Ins_CINDEX, 7869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MINDEX */ Ins_MINDEX, 7870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* AlignPTS */ Ins_ALIGNPTS, 7871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x28 */ Ins_UNKNOWN, 7872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* UTP */ Ins_UTP, 7873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* LOOPCALL */ Ins_LOOPCALL, 7874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CALL */ Ins_CALL, 7875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FDEF */ Ins_FDEF, 7876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ENDF */ Ins_ENDF, 7877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDAP[0] */ Ins_MDAP, 7878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDAP[1] */ Ins_MDAP, 7879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IUP[0] */ Ins_IUP, 7881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IUP[1] */ Ins_IUP, 7882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHP[0] */ Ins_SHP, 7883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHP[1] */ Ins_SHP, 7884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHC[0] */ Ins_SHC, 7885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHC[1] */ Ins_SHC, 7886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHZ[0] */ Ins_SHZ, 7887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHZ[1] */ Ins_SHZ, 7888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SHPIX */ Ins_SHPIX, 7889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IP */ Ins_IP, 7890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MSIRP[0] */ Ins_MSIRP, 7891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MSIRP[1] */ Ins_MSIRP, 7892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* AlignRP */ Ins_ALIGNRP, 7893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RTDG */ Ins_RTDG, 7894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIAP[0] */ Ins_MIAP, 7895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIAP[1] */ Ins_MIAP, 7896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NPushB */ Ins_NPUSHB, 7898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NPushW */ Ins_NPUSHW, 7899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* WS */ Ins_WS, 7900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RS */ Ins_RS, 7901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* WCvtP */ Ins_WCVTP, 7902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RCvt */ Ins_RCVT, 7903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GC[0] */ Ins_GC, 7904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GC[1] */ Ins_GC, 7905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SCFS */ Ins_SCFS, 7906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MD[0] */ Ins_MD, 7907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MD[1] */ Ins_MD, 7908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MPPEM */ Ins_MPPEM, 7909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MPS */ Ins_MPS, 7910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FlipON */ Ins_FLIPON, 7911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FlipOFF */ Ins_FLIPOFF, 7912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DEBUG */ Ins_DEBUG, 7913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* LT */ Ins_LT, 7915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* LTEQ */ Ins_LTEQ, 7916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GT */ Ins_GT, 7917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GTEQ */ Ins_GTEQ, 7918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* EQ */ Ins_EQ, 7919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NEQ */ Ins_NEQ, 7920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ODD */ Ins_ODD, 7921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* EVEN */ Ins_EVEN, 7922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IF */ Ins_IF, 7923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* EIF */ Ins_EIF, 7924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* AND */ Ins_AND, 7925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* OR */ Ins_OR, 7926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NOT */ Ins_NOT, 7927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DeltaP1 */ Ins_DELTAP, 7928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SDB */ Ins_SDB, 7929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SDS */ Ins_SDS, 7930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ADD */ Ins_ADD, 7932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SUB */ Ins_SUB, 7933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DIV */ Ins_DIV, 7934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MUL */ Ins_MUL, 7935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ABS */ Ins_ABS, 7936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NEG */ Ins_NEG, 7937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FLOOR */ Ins_FLOOR, 7938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* CEILING */ Ins_CEILING, 7939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROUND[0] */ Ins_ROUND, 7940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROUND[1] */ Ins_ROUND, 7941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROUND[2] */ Ins_ROUND, 7942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROUND[3] */ Ins_ROUND, 7943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NROUND[0] */ Ins_NROUND, 7944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NROUND[1] */ Ins_NROUND, 7945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NROUND[2] */ Ins_NROUND, 7946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* NROUND[3] */ Ins_NROUND, 7947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* WCvtF */ Ins_WCVTF, 7949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DeltaP2 */ Ins_DELTAP, 7950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DeltaP3 */ Ins_DELTAP, 7951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DeltaCn[0] */ Ins_DELTAC, 7952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DeltaCn[1] */ Ins_DELTAC, 7953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* DeltaCn[2] */ Ins_DELTAC, 7954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SROUND */ Ins_SROUND, 7955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* S45Round */ Ins_S45ROUND, 7956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* JROT */ Ins_JROT, 7957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* JROF */ Ins_JROF, 7958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROFF */ Ins_ROFF, 7959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x7B */ Ins_UNKNOWN, 7960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RUTG */ Ins_RUTG, 7961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RDTG */ Ins_RDTG, 7962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SANGW */ Ins_SANGW, 7963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* AA */ Ins_AA, 7964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FlipPT */ Ins_FLIPPT, 7966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FlipRgON */ Ins_FLIPRGON, 7967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* FlipRgOFF */ Ins_FLIPRGOFF, 7968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x83 */ Ins_UNKNOWN, 7969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x84 */ Ins_UNKNOWN, 7970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ScanCTRL */ Ins_SCANCTRL, 7971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SDPVTL[0] */ Ins_SDPVTL, 7972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* SDPVTL[1] */ Ins_SDPVTL, 7973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* GetINFO */ Ins_GETINFO, 7974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* IDEF */ Ins_IDEF, 7975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ROLL */ Ins_ROLL, 7976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MAX */ Ins_MAX, 7977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIN */ Ins_MIN, 7978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ScanTYPE */ Ins_SCANTYPE, 7979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* InstCTRL */ Ins_INSTCTRL, 7980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x8F */ Ins_UNKNOWN, 7981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x90 */ Ins_UNKNOWN, 7983049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x91 */ Ins_UNKNOWN, 7984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x92 */ Ins_UNKNOWN, 7985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x93 */ Ins_UNKNOWN, 7986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x94 */ Ins_UNKNOWN, 7987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x95 */ Ins_UNKNOWN, 7988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x96 */ Ins_UNKNOWN, 7989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x97 */ Ins_UNKNOWN, 7990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x98 */ Ins_UNKNOWN, 7991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x99 */ Ins_UNKNOWN, 7992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x9A */ Ins_UNKNOWN, 7993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x9B */ Ins_UNKNOWN, 7994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x9C */ Ins_UNKNOWN, 7995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x9D */ Ins_UNKNOWN, 7996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x9E */ Ins_UNKNOWN, 7997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0x9F */ Ins_UNKNOWN, 7998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 7999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xA0 */ Ins_UNKNOWN, 8000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xA1 */ Ins_UNKNOWN, 8001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xA2 */ Ins_UNKNOWN, 8002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xA3 */ Ins_UNKNOWN, 8003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xA4 */ Ins_UNKNOWN, 8004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xA5 */ Ins_UNKNOWN, 8005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xA6 */ Ins_UNKNOWN, 8006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xA7 */ Ins_UNKNOWN, 8007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xA8 */ Ins_UNKNOWN, 8008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xA9 */ Ins_UNKNOWN, 8009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xAA */ Ins_UNKNOWN, 8010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xAB */ Ins_UNKNOWN, 8011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xAC */ Ins_UNKNOWN, 8012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xAD */ Ins_UNKNOWN, 8013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xAE */ Ins_UNKNOWN, 8014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* INS_0xAF */ Ins_UNKNOWN, 8015049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8016049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[0] */ Ins_PUSHB, 8017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[1] */ Ins_PUSHB, 8018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[2] */ Ins_PUSHB, 8019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[3] */ Ins_PUSHB, 8020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[4] */ Ins_PUSHB, 8021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[5] */ Ins_PUSHB, 8022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[6] */ Ins_PUSHB, 8023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushB[7] */ Ins_PUSHB, 8024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[0] */ Ins_PUSHW, 8025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[1] */ Ins_PUSHW, 8026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[2] */ Ins_PUSHW, 8027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[3] */ Ins_PUSHW, 8028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[4] */ Ins_PUSHW, 8029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[5] */ Ins_PUSHW, 8030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[6] */ Ins_PUSHW, 8031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* PushW[7] */ Ins_PUSHW, 8032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[00] */ Ins_MDRP, 8034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[01] */ Ins_MDRP, 8035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[02] */ Ins_MDRP, 8036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[03] */ Ins_MDRP, 8037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[04] */ Ins_MDRP, 8038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[05] */ Ins_MDRP, 8039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[06] */ Ins_MDRP, 8040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[07] */ Ins_MDRP, 8041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[08] */ Ins_MDRP, 8042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[09] */ Ins_MDRP, 8043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[10] */ Ins_MDRP, 8044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[11] */ Ins_MDRP, 8045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[12] */ Ins_MDRP, 8046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[13] */ Ins_MDRP, 8047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[14] */ Ins_MDRP, 8048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[15] */ Ins_MDRP, 8049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[16] */ Ins_MDRP, 8051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[17] */ Ins_MDRP, 8052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[18] */ Ins_MDRP, 8053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[19] */ Ins_MDRP, 8054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[20] */ Ins_MDRP, 8055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[21] */ Ins_MDRP, 8056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[22] */ Ins_MDRP, 8057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[23] */ Ins_MDRP, 8058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[24] */ Ins_MDRP, 8059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[25] */ Ins_MDRP, 8060049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[26] */ Ins_MDRP, 8061049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[27] */ Ins_MDRP, 8062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[28] */ Ins_MDRP, 8063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[29] */ Ins_MDRP, 8064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[30] */ Ins_MDRP, 8065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MDRP[31] */ Ins_MDRP, 8066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[00] */ Ins_MIRP, 8068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[01] */ Ins_MIRP, 8069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[02] */ Ins_MIRP, 8070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[03] */ Ins_MIRP, 8071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[04] */ Ins_MIRP, 8072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[05] */ Ins_MIRP, 8073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[06] */ Ins_MIRP, 8074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[07] */ Ins_MIRP, 8075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[08] */ Ins_MIRP, 8076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[09] */ Ins_MIRP, 8077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[10] */ Ins_MIRP, 8078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[11] */ Ins_MIRP, 8079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[12] */ Ins_MIRP, 8080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[13] */ Ins_MIRP, 8081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[14] */ Ins_MIRP, 8082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[15] */ Ins_MIRP, 8083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[16] */ Ins_MIRP, 8085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[17] */ Ins_MIRP, 8086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[18] */ Ins_MIRP, 8087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[19] */ Ins_MIRP, 8088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[20] */ Ins_MIRP, 8089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[21] */ Ins_MIRP, 8090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[22] */ Ins_MIRP, 8091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[23] */ Ins_MIRP, 8092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[24] */ Ins_MIRP, 8093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[25] */ Ins_MIRP, 8094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[26] */ Ins_MIRP, 8095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[27] */ Ins_MIRP, 8096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[28] */ Ins_MIRP, 8097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[29] */ Ins_MIRP, 8098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[30] */ Ins_MIRP, 8099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* MIRP[31] */ Ins_MIRP 8100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project }; 8101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */ 8104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 8107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 8108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* RUN */ 8109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 8110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* This function executes a run of opcodes. It will exit in the */ 8111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* following cases: */ 8112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 8113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* - Errors (in which case it returns FALSE). */ 8114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 8115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* - Reaching the end of the main code range (returns TRUE). */ 8116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Reaching the end of a code range within a function call is an */ 8117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* error. */ 8118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 8119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* - After executing one single opcode, if the flag `Instruction_Trap' */ 8120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* is set to TRUE (returns TRUE). */ 8121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 8122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* On exit with TRUE, test IP < CodeSize to know whether it comes from */ 8123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* an instruction trap or a normal termination. */ 8124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 8125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 8126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Note: The documented DEBUG opcode pops a value from the stack. This */ 8127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* behaviour is unsupported; here a DEBUG opcode is always an */ 8128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* error. */ 8129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 8130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 8131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* THIS IS THE INTERPRETER'S MAIN LOOP. */ 8132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 8133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Instructions appear in the specification's order. */ 8134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 8135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 8136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* documentation is in ttinterp.h */ 8139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_EXPORT_DEF( FT_Error ) 8141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_RunIns( TT_ExecContext exc ) 8142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8143727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Long ins_counter = 0; /* executed instructions counter */ 8144727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_UShort i; 8145727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 8146727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 8147727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Byte opcode_pattern[1][2] = { 8148727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* #8 TypeMan Talk Align */ 8149727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 8150727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x06, /* SPVTL */ 8151727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 0x7D, /* RDTG */ 8152727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease }, 8153727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease }; 8154727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_UShort opcode_patterns = 1; 8155727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_UShort opcode_pointer[1] = { 0 }; 8156727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_UShort opcode_size[1] = { 1 }; 8157727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 8158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_STATIC_RASTER 8161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project cur = *exc; 8162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 8163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8164727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 8165727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.iup_called = FALSE; 8166727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 8167727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 8168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set CVT functions */ 8169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.tt_metrics.ratio = 0; 8170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem ) 8171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* non-square pixels, use the stretched routines */ 8173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_read_cvt = Read_CVT_Stretched; 8174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_write_cvt = Write_CVT_Stretched; 8175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move_cvt = Move_CVT_Stretched; 8176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 8178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* square pixels, use normal routines */ 8180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_read_cvt = Read_CVT; 8181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_write_cvt = Write_CVT; 8182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.func_move_cvt = Move_CVT; 8183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project COMPUTE_Funcs(); 8186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project COMPUTE_Round( (FT_Byte)exc->GS.round_state ); 8187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project do 8189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.opcode = CUR.code[CUR.IP]; 8191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8192aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_TRACE7(( " " )); 8193aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_TRACE7(( opcode_name[CUR.opcode] )); 8194aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich FT_TRACE7(( "\n" )); 8195aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich 8196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 ) 8197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 819841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier if ( CUR.IP + 1 >= CUR.codeSize ) 8199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto LErrorCodeOverflow_; 8200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1]; 8202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.IP + CUR.length > CUR.codeSize ) 8205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto LErrorCodeOverflow_; 8206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* First, let's check for empty stack and overflow */ 8208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 ); 8209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* `args' is the top of the stack once arguments have been popped. */ 8211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* One can also interpret it as the index of the last argument. */ 8212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.args < 0 ) 8213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8214aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner if ( CUR.pedantic_hinting ) 8215aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner { 8216727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Too_Few_Arguments ); 8217aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner goto LErrorLabel_; 8218aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner } 8219aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner 8220aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner /* push zeroes onto the stack */ 8221aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner for ( i = 0; i < Pop_Push_Count[CUR.opcode] >> 4; i++ ) 8222aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CUR.stack[i] = 0; 8223aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner CUR.args = 0; 8224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 ); 8227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* `new_top' is the new top of the stack, after the instruction's */ 8229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* execution. `top' will be set to `new_top' after the `switch' */ 8230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* statement. */ 8231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.new_top > CUR.stackSize ) 8232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8233727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Stack_Overflow ); 8234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto LErrorLabel_; 8235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.step_ins = TRUE; 8238727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_Err_Ok; 8239727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 8240727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING 8241727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 8242727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( SUBPIXEL_HINTING ) 8243727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 8244727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease for ( i = 0; i < opcode_patterns; i++ ) 8245727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 8246727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( opcode_pointer[i] < opcode_size[i] && 8247727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.opcode == opcode_pattern[i][opcode_pointer[i]] ) 8248727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 8249727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease opcode_pointer[i] += 1; 8250727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 8251727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( opcode_pointer[i] == opcode_size[i] ) 8252727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 8253727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_TRACE7(( "sph: opcode ptrn: %d, %s %s\n", 8254727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease i, 8255727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->root.family_name, 8256727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.face->root.style_name )); 8257727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 8258727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease switch ( i ) 8259727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 8260727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case 0: 8261727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease break; 8262727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 8263727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease opcode_pointer[i] = 0; 8264727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 8265727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 8266727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 8267727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease opcode_pointer[i] = 0; 8268727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 8269727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 8270727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 8271727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */ 8272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH 8274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long* args = CUR.stack + CUR.args; 8277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte opcode = CUR.opcode; 8278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef ARRAY_BOUND_ERROR 8281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ARRAY_BOUND_ERROR goto Set_Invalid_Ref 8282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( opcode ) 8285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x00: /* SVTCA y */ 8287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x01: /* SVTCA x */ 8288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x02: /* SPvTCA y */ 8289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x03: /* SPvTCA x */ 8290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x04: /* SFvTCA y */ 8291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x05: /* SFvTCA x */ 8292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8293aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner FT_Short AA, BB; 8294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project AA = (FT_Short)( ( opcode & 1 ) << 14 ); 8297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project BB = (FT_Short)( AA ^ 0x4000 ); 8298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( opcode < 4 ) 8300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.projVector.x = AA; 8302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.projVector.y = BB; 8303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.dualVector.x = AA; 8305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.dualVector.y = BB; 8306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 8308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GUESS_VECTOR( projVector ); 8310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ( opcode & 2 ) == 0 ) 8313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.freeVector.x = AA; 8315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.GS.freeVector.y = BB; 8316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 8318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project GUESS_VECTOR( freeVector ); 8320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project COMPUTE_Funcs(); 8323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x06: /* SPvTL // */ 8327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x07: /* SPvTL + */ 8328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SPVTL 8329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x08: /* SFvTL // */ 8332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x09: /* SFvTL + */ 8333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SFVTL 8334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x0A: /* SPvFS */ 8337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SPVFS 8338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x0B: /* SFvFS */ 8341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SFVFS 8342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x0C: /* GPV */ 8345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_GPV 8346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x0D: /* GFV */ 8349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_GFV 8350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x0E: /* SFvTPv */ 8353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SFVTPV 8354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x0F: /* ISECT */ 8357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ISECT( EXEC_ARG_ args ); 8358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x10: /* SRP0 */ 8361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SRP0 8362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x11: /* SRP1 */ 8365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SRP1 8366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x12: /* SRP2 */ 8369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SRP2 8370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x13: /* SZP0 */ 8373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SZP0( EXEC_ARG_ args ); 8374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x14: /* SZP1 */ 8377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SZP1( EXEC_ARG_ args ); 8378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x15: /* SZP2 */ 8381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SZP2( EXEC_ARG_ args ); 8382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x16: /* SZPS */ 8385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SZPS( EXEC_ARG_ args ); 8386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x17: /* SLOOP */ 8389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SLOOP 8390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x18: /* RTG */ 8393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RTG 8394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x19: /* RTHG */ 8397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RTHG 8398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x1A: /* SMD */ 8401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SMD 8402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x1B: /* ELSE */ 8405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ELSE( EXEC_ARG_ args ); 8406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x1C: /* JMPR */ 8409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_JMPR 8410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x1D: /* SCVTCI */ 8413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SCVTCI 8414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x1E: /* SSWCI */ 8417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SSWCI 8418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x1F: /* SSW */ 8421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SSW 8422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x20: /* DUP */ 8425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_DUP 8426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x21: /* POP */ 8429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* nothing :-) */ 8430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x22: /* CLEAR */ 8433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_CLEAR 8434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x23: /* SWAP */ 8437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SWAP 8438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x24: /* DEPTH */ 8441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_DEPTH 8442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x25: /* CINDEX */ 8445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_CINDEX 8446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x26: /* MINDEX */ 8449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MINDEX( EXEC_ARG_ args ); 8450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x27: /* ALIGNPTS */ 8453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ALIGNPTS( EXEC_ARG_ args ); 8454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x28: /* ???? */ 8457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_UNKNOWN( EXEC_ARG_ args ); 8458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x29: /* UTP */ 8461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_UTP( EXEC_ARG_ args ); 8462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x2A: /* LOOPCALL */ 8465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_LOOPCALL( EXEC_ARG_ args ); 8466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x2B: /* CALL */ 8469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_CALL( EXEC_ARG_ args ); 8470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x2C: /* FDEF */ 8473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_FDEF( EXEC_ARG_ args ); 8474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x2D: /* ENDF */ 8477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ENDF( EXEC_ARG_ args ); 8478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x2E: /* MDAP */ 8481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x2F: /* MDAP */ 8482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MDAP( EXEC_ARG_ args ); 8483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x30: /* IUP */ 8486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x31: /* IUP */ 8487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_IUP( EXEC_ARG_ args ); 8488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x32: /* SHP */ 8491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x33: /* SHP */ 8492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SHP( EXEC_ARG_ args ); 8493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x34: /* SHC */ 8496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x35: /* SHC */ 8497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SHC( EXEC_ARG_ args ); 8498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x36: /* SHZ */ 8501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x37: /* SHZ */ 8502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SHZ( EXEC_ARG_ args ); 8503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x38: /* SHPIX */ 8506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SHPIX( EXEC_ARG_ args ); 8507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x39: /* IP */ 8510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_IP( EXEC_ARG_ args ); 8511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x3A: /* MSIRP */ 8514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x3B: /* MSIRP */ 8515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MSIRP( EXEC_ARG_ args ); 8516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x3C: /* AlignRP */ 8519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ALIGNRP( EXEC_ARG_ args ); 8520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x3D: /* RTDG */ 8523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RTDG 8524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x3E: /* MIAP */ 8527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x3F: /* MIAP */ 8528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MIAP( EXEC_ARG_ args ); 8529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x40: /* NPUSHB */ 8532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_NPUSHB( EXEC_ARG_ args ); 8533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x41: /* NPUSHW */ 8536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_NPUSHW( EXEC_ARG_ args ); 8537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x42: /* WS */ 8540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_WS 8541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Set_Invalid_Ref: 8544727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 8545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x43: /* RS */ 8548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RS 8549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x44: /* WCVTP */ 8552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_WCVTP 8553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x45: /* RCVT */ 8556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RCVT 8557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x46: /* GC */ 8560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x47: /* GC */ 8561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_GC( EXEC_ARG_ args ); 8562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x48: /* SCFS */ 8565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SCFS( EXEC_ARG_ args ); 8566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x49: /* MD */ 8569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x4A: /* MD */ 8570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MD( EXEC_ARG_ args ); 8571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x4B: /* MPPEM */ 8574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_MPPEM 8575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x4C: /* MPS */ 8578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_MPS 8579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x4D: /* FLIPON */ 8582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_FLIPON 8583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x4E: /* FLIPOFF */ 8586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_FLIPOFF 8587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x4F: /* DEBUG */ 8590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_DEBUG 8591049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x50: /* LT */ 8594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_LT 8595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x51: /* LTEQ */ 8598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_LTEQ 8599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x52: /* GT */ 8602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_GT 8603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x53: /* GTEQ */ 8606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_GTEQ 8607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x54: /* EQ */ 8610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_EQ 8611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x55: /* NEQ */ 8614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_NEQ 8615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x56: /* ODD */ 8618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_ODD 8619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x57: /* EVEN */ 8622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_EVEN 8623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x58: /* IF */ 8626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_IF( EXEC_ARG_ args ); 8627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x59: /* EIF */ 8630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* do nothing */ 8631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x5A: /* AND */ 8634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_AND 8635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x5B: /* OR */ 8638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_OR 8639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x5C: /* NOT */ 8642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_NOT 8643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x5D: /* DELTAP1 */ 8646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_DELTAP( EXEC_ARG_ args ); 8647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x5E: /* SDB */ 8650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SDB 8651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x5F: /* SDS */ 8654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SDS 8655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x60: /* ADD */ 8658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_ADD 8659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x61: /* SUB */ 8662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SUB 8663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x62: /* DIV */ 8666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_DIV 8667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x63: /* MUL */ 8670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_MUL 8671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x64: /* ABS */ 8674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_ABS 8675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x65: /* NEG */ 8678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_NEG 8679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x66: /* FLOOR */ 8682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_FLOOR 8683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x67: /* CEILING */ 8686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_CEILING 8687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x68: /* ROUND */ 8690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x69: /* ROUND */ 8691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x6A: /* ROUND */ 8692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x6B: /* ROUND */ 8693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_ROUND 8694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x6C: /* NROUND */ 8697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x6D: /* NROUND */ 8698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x6E: /* NRRUND */ 8699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x6F: /* NROUND */ 8700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_NROUND 8701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x70: /* WCVTF */ 8704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_WCVTF 8705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x71: /* DELTAP2 */ 8708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x72: /* DELTAP3 */ 8709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_DELTAP( EXEC_ARG_ args ); 8710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x73: /* DELTAC0 */ 8713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x74: /* DELTAC1 */ 8714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x75: /* DELTAC2 */ 8715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_DELTAC( EXEC_ARG_ args ); 8716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x76: /* SROUND */ 8719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_SROUND 8720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x77: /* S45Round */ 8723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_S45ROUND 8724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x78: /* JROT */ 8727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_JROT 8728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x79: /* JROF */ 8731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_JROF 8732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x7A: /* ROFF */ 8735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_ROFF 8736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x7B: /* ???? */ 8739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_UNKNOWN( EXEC_ARG_ args ); 8740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x7C: /* RUTG */ 8743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RUTG 8744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x7D: /* RDTG */ 8747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_RDTG 8748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x7E: /* SANGW */ 8751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x7F: /* AA */ 8752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* nothing - obsolete */ 8753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x80: /* FLIPPT */ 8756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_FLIPPT( EXEC_ARG_ args ); 8757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x81: /* FLIPRGON */ 8760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_FLIPRGON( EXEC_ARG_ args ); 8761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x82: /* FLIPRGOFF */ 8764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_FLIPRGOFF( EXEC_ARG_ args ); 8765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x83: /* UNKNOWN */ 8768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x84: /* UNKNOWN */ 8769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_UNKNOWN( EXEC_ARG_ args ); 8770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x85: /* SCANCTRL */ 8773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SCANCTRL( EXEC_ARG_ args ); 8774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x86: /* SDPVTL */ 8777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x87: /* SDPVTL */ 8778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SDPVTL( EXEC_ARG_ args ); 8779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x88: /* GETINFO */ 8782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_GETINFO( EXEC_ARG_ args ); 8783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x89: /* IDEF */ 8786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_IDEF( EXEC_ARG_ args ); 8787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x8A: /* ROLL */ 8790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_ROLL( EXEC_ARG_ args ); 8791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x8B: /* MAX */ 8794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_MAX 8795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x8C: /* MIN */ 8798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project DO_MIN 8799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x8D: /* SCANTYPE */ 8802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_SCANTYPE( EXEC_ARG_ args ); 8803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x8E: /* INSTCTRL */ 8806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_INSTCTRL( EXEC_ARG_ args ); 8807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case 0x8F: 8810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_UNKNOWN( EXEC_ARG_ args ); 8811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 8814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( opcode >= 0xE0 ) 8815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MIRP( EXEC_ARG_ args ); 8816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( opcode >= 0xC0 ) 8817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_MDRP( EXEC_ARG_ args ); 8818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( opcode >= 0xB8 ) 8819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_PUSHW( EXEC_ARG_ args ); 8820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else if ( opcode >= 0xB0 ) 8821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_PUSHB( EXEC_ARG_ args ); 8822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 8823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Ins_UNKNOWN( EXEC_ARG_ args ); 8824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#else 8829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] ); 8831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */ 8833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8834727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( CUR.error ) 8835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( CUR.error ) 8837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8838727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* looking for redefined instructions */ 8839727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease case FT_ERR( Invalid_Opcode ): 8840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DefRecord* def = CUR.IDefs; 8842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_DefRecord* limit = def + CUR.numIDefs; 8843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; def < limit; def++ ) 8846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( def->active && CUR.opcode == (FT_Byte)def->opc ) 8848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project TT_CallRec* callrec; 8850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.callTop >= CUR.callSize ) 8853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8854727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Reference ); 8855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto LErrorLabel_; 8856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project callrec = &CUR.callStack[CUR.callTop]; 8859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project callrec->Caller_Range = CUR.curRange; 8861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project callrec->Caller_IP = CUR.IP + 1; 8862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project callrec->Cur_Count = 1; 8863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project callrec->Cur_Restart = def->start; 886441371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier callrec->Cur_End = def->end; 8865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE ) 8867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto LErrorLabel_; 8868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto LSuiteLabel_; 8870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8874727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Invalid_Opcode ); 8875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto LErrorLabel_; 8876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0 8878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; /* Unreachable code warning suppression. */ 8879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Leave to remind in case a later change the editor */ 8880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* to consider break; */ 8881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 8882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 8884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto LErrorLabel_; 8885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0 8887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 8888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 8889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.top = CUR.new_top; 8893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.step_ins ) 8895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project CUR.IP += CUR.length; 8896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* increment instruction counter and check if we didn't */ 8898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* run this program for too long (e.g. infinite loops). */ 8899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ++ins_counter > MAX_RUNNABLE_OPCODES ) 8900727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Execution_Too_Long ); 8901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LSuiteLabel_: 8903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.IP >= CUR.codeSize ) 8904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( CUR.callTop > 0 ) 8906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 8907727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Code_Overflow ); 8908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto LErrorLabel_; 8909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 8911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto LNo_Error_; 8912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } while ( !CUR.instruction_trap ); 8914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LNo_Error_: 8916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_STATIC_RASTER 8918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *exc = cur; 8919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 8920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8921727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 8922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LErrorCodeOverflow_: 8924727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CUR.error = FT_THROW( Code_Overflow ); 8925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project LErrorLabel_: 8927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef TT_CONFIG_OPTION_STATIC_RASTER 8929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *exc = cur; 8930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 8931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 89327f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* If any errors have occurred, function tables may be broken. */ 89337f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* Force a re-execution of `prep' and `fpgm' tables if no */ 89347f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner /* bytecode debugger is run. */ 89357f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner if ( CUR.error && !CUR.instruction_trap ) 89367f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner { 89377f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner FT_TRACE1(( " The interpreter returned error 0x%x\n", CUR.error )); 893841371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier exc->size->cvt_ready = FALSE; 89397f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner } 89407f08cbd7d6dcf19b8d8e4328e33032aee342e3b4David 'Digit' Turner 8941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return CUR.error; 8942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 8943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif /* TT_USE_BYTECODE_INTERPRETER */ 8946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 8948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 8949