1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* pshrec.c */ 4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* FreeType PostScript hints recorder (body). */ 6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* Copyright 2001-2004, 2007, 2009, 2013 by */ 8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* This file is part of the FreeType project, and may only be used, */ 11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* modified, and distributed under the terms of the FreeType project */ 12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* this file you indicate that you have read the license and */ 14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* understand and accept it fully. */ 15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* */ 16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/ 17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h> 20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_FREETYPE_H 21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_OBJECTS_H 22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H 23295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner#include FT_INTERNAL_CALC_H 24295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "pshrec.h" 26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "pshalgo.h" 27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "pshnterr.h" 29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef FT_COMPONENT 31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT trace_pshrec 32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef DEBUG_HINTER 34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Hints ps_debug_hints = 0; 35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int ps_debug_no_horz_hints = 0; 36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project int ps_debug_no_vert_hints = 0; 37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** PS_HINT MANAGEMENT *****/ 44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* destroy hints table */ 49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hint_table_done( PS_Hint_Table table, 51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( table->hints ); 54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project table->num_hints = 0; 55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project table->max_hints = 0; 56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ensure that a table can contain "count" elements */ 60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hint_table_ensure( PS_Hint_Table table, 62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count, 63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt old_max = table->max_hints; 66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt new_max = count; 67727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( new_max > old_max ) 71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* try to grow the table */ 73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_max = FT_PAD_CEIL( new_max, 8 ); 74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) ) 75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project table->max_hints = new_max; 76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hint_table_alloc( PS_Hint_Table table, 83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory, 84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Hint *ahint ) 85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 86727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count; 88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Hint hint = 0; 89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = table->num_hints; 92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count++; 93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( count >= table->max_hints ) 95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_hint_table_ensure( table, count, memory ); 97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hint = table->hints + count - 1; 102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hint->pos = 0; 103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hint->len = 0; 104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hint->flags = 0; 105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project table->num_hints = count; 107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *ahint = hint; 110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** PS_MASK MANAGEMENT *****/ 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 /* destroy mask */ 123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_done( PS_Mask mask, 125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( mask->bytes ); 128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask->num_bits = 0; 129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask->max_bits = 0; 130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask->end_point = 0; 131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ensure that a mask can contain "count" bits */ 135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_ensure( PS_Mask mask, 137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count, 138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt old_max = ( mask->max_bits + 7 ) >> 3; 141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt new_max = ( count + 7 ) >> 3; 142727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( new_max > old_max ) 146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_max = FT_PAD_CEIL( new_max, 8 ); 148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) ) 149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask->max_bits = new_max * 8; 150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* test a bit value in a given mask */ 156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Int 157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_test_bit( PS_Mask mask, 158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int idx ) 159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( (FT_UInt)idx >= mask->num_bits ) 161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) ); 164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* clear a given bit */ 168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_clear_bit( PS_Mask mask, 170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int idx ) 171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* p; 173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( (FT_UInt)idx >= mask->num_bits ) 176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p = mask->bytes + ( idx >> 3 ); 179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) ); 180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set a given bit, possibly grow the mask */ 184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_set_bit( PS_Mask mask, 186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int idx, 187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 189727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* p; 191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( idx < 0 ) 194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( (FT_UInt)idx >= mask->num_bits ) 197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_ensure( mask, idx + 1, memory ); 199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask->num_bits = idx + 1; 203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p = mask->bytes + ( idx >> 3 ); 206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) ); 207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* destroy mask table */ 214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_table_done( PS_Mask_Table table, 216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count = table->max_masks; 219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask mask = table->masks; 220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; count > 0; count--, mask++ ) 223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_done( mask, memory ); 224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_FREE( table->masks ); 226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project table->num_masks = 0; 227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project table->max_masks = 0; 228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* ensure that a mask table can contain "count" masks */ 232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_table_ensure( PS_Mask_Table table, 234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count, 235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt old_max = table->max_masks; 238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt new_max = count; 239727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( new_max > old_max ) 243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project new_max = FT_PAD_CEIL( new_max, 8 ); 245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) ) 246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project table->max_masks = new_max; 247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* allocate a new mask in a table */ 253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_table_alloc( PS_Mask_Table table, 255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory, 256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask *amask ) 257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count; 259727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask mask = 0; 261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = table->num_masks; 264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count++; 265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( count > table->max_masks ) 267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_table_ensure( table, count, memory ); 269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask = table->masks + count - 1; 274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask->num_bits = 0; 275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask->end_point = 0; 276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project table->num_masks = count; 277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *amask = mask; 280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* return last hint mask in a table, create one if the table is empty */ 285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_table_last( PS_Mask_Table table, 287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory, 288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask *amask ) 289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 290727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count; 292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask mask; 293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = table->num_masks; 296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( count == 0 ) 297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_table_alloc( table, memory, &mask ); 299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask = table->masks + count - 1; 304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *amask = mask; 307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set a new mask to a given bit range */ 312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_table_set_bits( PS_Mask_Table table, 314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Byte* source, 315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt bit_pos, 316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt bit_count, 317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 319727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error; 320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask mask; 321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_table_last( table, memory, &mask ); 324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_ensure( mask, bit_count, memory ); 328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask->num_bits = bit_count; 332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now, copy bits */ 334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* read = (FT_Byte*)source + ( bit_pos >> 3 ); 336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int rmask = 0x80 >> ( bit_pos & 7 ); 337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* write = mask->bytes; 338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int wmask = 0x80; 339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int val; 340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; bit_count > 0; bit_count-- ) 343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val = write[0] & ~wmask; 345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( read[0] & rmask ) 347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project val |= wmask; 348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project write[0] = (FT_Byte)val; 350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project rmask >>= 1; 352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( rmask == 0 ) 353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project read++; 355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project rmask = 0x80; 356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project wmask >>= 1; 359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( wmask == 0 ) 360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project write++; 362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project wmask = 0x80; 363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 372049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* test whether two masks in a table intersect */ 373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Int 374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_table_test_intersect( PS_Mask_Table table, 375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int index1, 376049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int index2 ) 377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask mask1 = table->masks + index1; 379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask mask2 = table->masks + index2; 380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* p1 = mask1->bytes; 381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* p2 = mask2->bytes; 382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count1 = mask1->num_bits; 383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count2 = mask2->num_bits; 384049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count; 385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 387727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease count = FT_MIN( count1, count2 ); 388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; count >= 8; count -= 8 ) 389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( p1[0] & p2[0] ) 391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 1; 392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p1++; 394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project p2++; 395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( count == 0 ) 398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return 0; 399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ( p1[0] & p2[0] ) & ~( 0xFF >> count ); 401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* merge two masks, used by ps_mask_table_merge_all */ 405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_table_merge( PS_Mask_Table table, 407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int index1, 408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int index2, 409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt temp; 412727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* swap index1 and index2 so that index1 < index2 */ 416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( index1 > index2 ) 417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project temp = index1; 419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project index1 = index2; 420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project index2 = temp; 421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( index1 < index2 && index1 >= 0 && index2 < (FT_Int)table->num_masks ) 424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* we need to merge the bitsets of index1 and index2 with a */ 426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* simple union */ 427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask mask1 = table->masks + index1; 428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask mask2 = table->masks + index2; 429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count1 = mask1->num_bits; 430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count2 = mask2->num_bits; 431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int delta; 432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( count2 > 0 ) 435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt pos; 437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* read; 438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Byte* write; 439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* if "count2" is greater than "count1", we need to grow the */ 442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* first bitset, and clear the highest bits */ 443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( count2 > count1 ) 444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_ensure( mask1, count2, memory ); 446049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( pos = count1; pos < count2; pos++ ) 450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_clear_bit( mask1, pos ); 451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* merge (unite) the bitsets */ 454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project read = mask2->bytes; 455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project write = mask1->bytes; 456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pos = (FT_UInt)( ( count2 + 7 ) >> 3 ); 457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; pos > 0; pos-- ) 459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project write[0] = (FT_Byte)( write[0] | read[0] ); 461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project write++; 462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project read++; 463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Now, remove "mask2" from the list. We need to keep the masks */ 467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* sorted in order of importance, so move table elements. */ 468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask2->num_bits = 0; 469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask2->end_point = 0; 470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project delta = table->num_masks - 1 - index2; /* number of masks to move */ 472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( delta > 0 ) 473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* move to end of table for reuse */ 475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_MaskRec dummy = *mask2; 476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ft_memmove( mask2, mask2 + 1, delta * sizeof ( PS_MaskRec ) ); 479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask2[delta] = dummy; 481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project table->num_masks--; 484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 486295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n", 487295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner index1, index2 )); 488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 494049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Try to merge all masks in a given table. This is used to merge */ 495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* all counter masks into independent counter "paths". */ 496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* */ 497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_table_merge_all( PS_Mask_Table table, 499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int index1, index2; 502727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 503049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( index1 = table->num_masks - 1; index1 > 0; index1-- ) 506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( index2 = index1 - 1; index2 >= 0; index2-- ) 508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ps_mask_table_test_intersect( table, index1, index2 ) ) 510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_table_merge( table, index2, index1, memory ); 512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** PS_DIMENSION MANAGEMENT *****/ 529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 533049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* finalize a given dimension */ 535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_done( PS_Dimension dimension, 537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_table_done( &dimension->counters, memory ); 540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_table_done( &dimension->masks, memory ); 541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hint_table_done( &dimension->hints, memory ); 542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* initialize a given dimension */ 546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_init( PS_Dimension dimension ) 548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dimension->hints.num_hints = 0; 550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dimension->masks.num_masks = 0; 551049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dimension->counters.num_masks = 0; 552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#if 0 556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set a bit at a given index in the current hint mask */ 558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_set_mask_bit( PS_Dimension dim, 560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt idx, 561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 563295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner PS_Mask mask; 564727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* get last hint mask */ 568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_table_last( &dim->masks, memory, &mask ); 569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_set_bit( mask, idx, memory ); 573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 578049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set the end point in a mask, called from "End" & "Reset" methods */ 581049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_end_mask( PS_Dimension dim, 583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt end_point ) 584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count = dim->masks.num_masks; 586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( count > 0 ) 589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 590727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease PS_Mask mask = dim->masks.masks + count - 1; 591727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 592727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project mask->end_point = end_point; 594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set the end point in the current mask, then create a new empty one */ 599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* (called by "Reset" method) */ 600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_reset_mask( PS_Dimension dim, 602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt end_point, 603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask mask; 606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* end current mask */ 609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_end_mask( dim, end_point ); 610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* allocate new one */ 612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ps_mask_table_alloc( &dim->masks, memory, &mask ); 613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set a new mask, called from the "T2Stem" method */ 617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_set_mask_bits( PS_Dimension dim, 619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Byte* source, 620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt source_pos, 621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt source_bits, 622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt end_point, 623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 625727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error; 626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reset current mask, if any */ 629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_dimension_reset_mask( dim, end_point, memory ); 630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set bits in new mask */ 634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_table_set_bits( &dim->masks, source, 635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project source_pos, source_bits, memory ); 636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* add a new single stem (called from "T1Stem" method) */ 643049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_add_t1stem( PS_Dimension dim, 645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int pos, 646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int len, 647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory, 648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int *aindex ) 649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 650727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt flags = 0; 652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 654049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* detect ghost stem */ 655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( len < 0 ) 656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flags |= PS_HINT_FLAG_GHOST; 658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( len == -21 ) 659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project flags |= PS_HINT_FLAG_BOTTOM; 661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project pos += len; 662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project len = 0; 664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( aindex ) 667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *aindex = -1; 668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now, lookup stem in the current hints table */ 670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask mask; 672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt idx; 673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt max = dim->hints.num_hints; 674049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Hint hint = dim->hints.hints; 675049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 676049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 677049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( idx = 0; idx < max; idx++, hint++ ) 678049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 679049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( hint->pos == pos && hint->len == len ) 680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* we need to create a new hint in the table */ 684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( idx >= max ) 685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_hint_table_alloc( &dim->hints, memory, &hint ); 687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 689049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hint->pos = pos; 691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hint->len = len; 692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hint->flags = flags; 693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now, store the hint in the current mask */ 696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_table_last( &dim->masks, memory, &mask ); 697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_set_bit( mask, idx, memory ); 701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( aindex ) 705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *aindex = (FT_Int)idx; 706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* add a "hstem3/vstem3" counter to our dimension table */ 714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_add_counter( PS_Dimension dim, 716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int hint1, 717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int hint2, 718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int hint3, 719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 721727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count = dim->counters.num_masks; 723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Mask counter = dim->counters.masks; 724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* try to find an existing counter mask that already uses */ 727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* one of these stems here */ 728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; count > 0; count--, counter++ ) 729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( ps_mask_test_bit( counter, hint1 ) || 731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_test_bit( counter, hint2 ) || 732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_mask_test_bit( counter, hint3 ) ) 733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* create a new counter when needed */ 737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( count == 0 ) 738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_table_alloc( &dim->counters, memory, &counter ); 740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now, set the bits for our hints in the counter mask */ 745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_set_bit( counter, hint1, memory ); 746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_set_bit( counter, hint2, memory ); 750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_mask_set_bit( counter, hint3, memory ); 754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Exit; 756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 757049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Exit: 758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 759049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* end of recording session for a given dimension */ 763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_end( PS_Dimension dim, 765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt end_point, 766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* end hint mask table */ 769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_end_mask( dim, end_point ); 770049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* merge all counter masks into independent "paths" */ 772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return ps_mask_table_merge_all( &dim->counters, memory ); 773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 777049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 778049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 779049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** PS_RECORDER MANAGEMENT *****/ 780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* destroy hints */ 786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL( void ) 787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hints_done( PS_Hints hints ) 788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = hints->memory; 790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_done( &hints->dimension[0], memory ); 793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_done( &hints->dimension[1], memory ); 794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 795727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease hints->error = FT_Err_Ok; 796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hints->memory = 0; 797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL( FT_Error ) 801049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hints_init( PS_Hints hints, 802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory ) 803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( hints, sizeof ( *hints ) ); 805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hints->memory = memory; 806727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* initialize a hints for a new session */ 811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 812049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hints_open( PS_Hints hints, 813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Hint_Type hint_type ) 814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( hint_type ) 816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case PS_HINT_TYPE_1: 818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case PS_HINT_TYPE_2: 819727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease hints->error = FT_Err_Ok; 820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hints->hint_type = hint_type; 821049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 822049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_init( &hints->dimension[0] ); 823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_dimension_init( &hints->dimension[1] ); 824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 827727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease hints->error = FT_THROW( Invalid_Argument ); 828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hints->hint_type = hint_type; 829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 830295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_TRACE0(( "ps_hints_open: invalid charstring type\n" )); 831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* add one or more stems to the current hints table */ 837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 838049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hints_stem( PS_Hints hints, 839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int dimension, 840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count, 841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Long* stems ) 842049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !hints->error ) 844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* limit "dimension" to 0..1 */ 846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dimension < 0 || dimension > 1 ) 847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 848295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n", 849295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner dimension )); 850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dimension = ( dimension != 0 ); 851049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 853049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* record the stems in the current hints/masks table */ 854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project switch ( hints->hint_type ) 855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case PS_HINT_TYPE_1: /* Type 1 "hstem" or "vstem" operator */ 857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project case PS_HINT_TYPE_2: /* Type 2 "hstem" or "vstem" operator */ 858049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Dimension dim = &hints->dimension[dimension]; 860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( ; count > 0; count--, stems += 2 ) 863049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = hints->memory; 866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_dimension_add_t1stem( 869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dim, (FT_Int)stems[0], (FT_Int)stems[1], 870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memory, NULL ); 871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ERROR(( "ps_hints_stem: could not add stem" 874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project " (%d,%d) to hints table\n", stems[0], stems[1] )); 875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hints->error = error; 877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 878049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project default: 884295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_TRACE0(( "ps_hints_stem: called with invalid hint type (%d)\n", 885295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner hints->hint_type )); 886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project break; 887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* add one Type1 counter stem to the current hints table */ 893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 894295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner ps_hints_t1stem3( PS_Hints hints, 895295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Int dimension, 896295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Fixed* stems ) 897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 898727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !hints->error ) 902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Dimension dim; 904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = hints->memory; 905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int count; 906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int idx[3]; 907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* limit "dimension" to 0..1 */ 910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( dimension < 0 || dimension > 1 ) 911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 912295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n", 913295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner dimension )); 914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dimension = ( dimension != 0 ); 915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project dim = &hints->dimension[dimension]; 918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* there must be 6 elements in the 'stem' array */ 920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( hints->hint_type == PS_HINT_TYPE_1 ) 921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* add the three stems to our hints/masks table */ 923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( count = 0; count < 3; count++, stems += 2 ) 924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 925295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner error = ps_dimension_add_t1stem( dim, 926295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner (FT_Int)FIXED_TO_INT( stems[0] ), 927295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner (FT_Int)FIXED_TO_INT( stems[1] ), 928295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner memory, &idx[count] ); 929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* now, add the hints to the counters table */ 934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2], 935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project memory ); 936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 941295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type\n" )); 942727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Argument ); 943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 944049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Fail: 950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" )); 951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hints->error = error; 952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* reset hints (only with Type 1 hints) */ 956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hints_t1reset( PS_Hints hints, 958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt end_point ) 959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 960727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !hints->error ) 964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 965049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = hints->memory; 966049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 967049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 968049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( hints->hint_type == PS_HINT_TYPE_1 ) 969049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 970049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_dimension_reset_mask( &hints->dimension[0], 971049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project end_point, memory ); 972049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 973049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 974049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 975049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_dimension_reset_mask( &hints->dimension[1], 976049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project end_point, memory ); 977049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 978049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 979049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 980049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project else 981049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 982049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* invalid hint type */ 983727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = FT_THROW( Invalid_Argument ); 984049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 985049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 986049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 987049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 988049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 989049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Fail: 990049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hints->error = error; 991049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 992049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 993049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 994049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* Type2 "hintmask" operator, add a new hintmask to each direction */ 995049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 996049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hints_t2mask( PS_Hints hints, 997049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt end_point, 998049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt bit_count, 999049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Byte* bytes ) 1000049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1001049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 1002049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1003049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1004049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !hints->error ) 1005049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1006049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Dimension dim = hints->dimension; 1007049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = hints->memory; 1008049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count1 = dim[0].hints.num_hints; 1009049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count2 = dim[1].hints.num_hints; 1010049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1011049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1012049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check bit count; must be equal to current total hint count */ 1013049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( bit_count != count1 + count2 ) 1014049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1015295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_TRACE0(( "ps_hints_t2mask:" 1016295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner " called with invalid bitcount %d (instead of %d)\n", 1017049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bit_count, count1 + count2 )); 1018049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1019049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* simply ignore the operator */ 1020049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 1021049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1022049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1023049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set-up new horizontal and vertical hint mask now */ 1024049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1, 1025049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project end_point, memory ); 1026049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1027049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 1028049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1029049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2, 1030049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project end_point, memory ); 1031049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1032049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 1033049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1034049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 1035049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1036049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Fail: 1037049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hints->error = error; 1038049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1039049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1040049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1041049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 1042049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hints_t2counter( PS_Hints hints, 1043049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt bit_count, 1044049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project const FT_Byte* bytes ) 1045049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1046049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 1047049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1048049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1049049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !hints->error ) 1050049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1051049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Dimension dim = hints->dimension; 1052049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = hints->memory; 1053049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count1 = dim[0].hints.num_hints; 1054049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt count2 = dim[1].hints.num_hints; 1055049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1056049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1057049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* check bit count, must be equal to current total hint count */ 1058049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( bit_count != count1 + count2 ) 1059049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1060295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_TRACE0(( "ps_hints_t2counter:" 1061295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner " called with invalid bitcount %d (instead of %d)\n", 1062049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project bit_count, count1 + count2 )); 1063049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1064049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* simply ignore the operator */ 1065049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 1066049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1067049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1068049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* set-up new horizontal and vertical hint mask now */ 1069049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1, 1070049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0, memory ); 1071049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1072049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 1073049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1074049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2, 1075049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 0, memory ); 1076049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( error ) 1077049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project goto Fail; 1078049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1079049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return; 1080049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1081049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project Fail: 1082049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project hints->error = error; 1083049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1084049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1085049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1086049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* end recording session */ 1087049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static FT_Error 1088049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hints_close( PS_Hints hints, 1089049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_UInt end_point ) 1090049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1091049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Error error; 1092049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1093049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1094049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = hints->error; 1095049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 1096049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1097049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Memory memory = hints->memory; 1098049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project PS_Dimension dim = hints->dimension; 1099049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_dimension_end( &dim[0], end_point, memory ); 1102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 1103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project error = ps_dimension_end( &dim[1], end_point, memory ); 1105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifdef DEBUG_HINTER 1109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( !error ) 1110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_debug_hints = hints; 1111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif 1112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project return error; 1113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 1119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** TYPE 1 HINTS RECORDING INTERFACE *****/ 1120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 1121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 1125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project t1_hints_open( T1_Hints hints ) 1126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 ); 1128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 1131295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner t1_hints_stem( T1_Hints hints, 1132295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Int dimension, 1133295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Fixed* coords ) 1134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1135295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner FT_Pos stems[2]; 1136295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 1137295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 1138295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner stems[0] = FIXED_TO_INT( coords[0] ); 1139295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner stems[1] = FIXED_TO_INT( coords[1] ); 1140295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner 1141295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner ps_hints_stem( (PS_Hints)hints, dimension, 1, stems ); 1142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 1146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ) 1147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) ); 1149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->open = (T1_Hints_OpenFunc) t1_hints_open; 1151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->close = (T1_Hints_CloseFunc) ps_hints_close; 1152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->stem = (T1_Hints_SetStemFunc) t1_hints_stem; 1153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3; 1154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->reset = (T1_Hints_ResetFunc) ps_hints_t1reset; 1155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->apply = (T1_Hints_ApplyFunc) ps_hints_apply; 1156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 1162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** TYPE 2 HINTS RECORDING INTERFACE *****/ 1163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /***** *****/ 1164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /*************************************************************************/ 1166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 1168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project t2_hints_open( T2_Hints hints ) 1169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 ); 1171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project static void 1175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project t2_hints_stems( T2_Hints hints, 1176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int dimension, 1177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int count, 1178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Fixed* coords ) 1179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Pos stems[32], y, n; 1181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_Int total = count; 1182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y = 0; 1185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project while ( total > 0 ) 1186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* determine number of stems to write */ 1188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = total; 1189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project if ( count > 16 ) 1190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project count = 16; 1191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compute integer stem positions in font units */ 1193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count * 2; n++ ) 1194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project y += coords[n]; 1196295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner stems[n] = FIXED_TO_INT( y ); 1197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* compute lengths */ 1200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project for ( n = 0; n < count * 2; n += 2 ) 1201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project stems[n + 1] = stems[n + 1] - stems[n]; 1202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project /* add them to the current dimension */ 1204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project ps_hints_stem( (PS_Hints)hints, dimension, count, stems ); 1205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project total -= count; 1207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_LOCAL_DEF( void ) 1212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ) 1213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project { 1214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project FT_MEM_ZERO( funcs, sizeof ( *funcs ) ); 1215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->open = (T2_Hints_OpenFunc) t2_hints_open; 1217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->close = (T2_Hints_CloseFunc) ps_hints_close; 1218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems; 1219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->hintmask= (T2_Hints_MaskFunc) ps_hints_t2mask; 1220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter; 1221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project funcs->apply = (T2_Hints_ApplyFunc) ps_hints_apply; 1222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project } 1223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project 1225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */ 1226