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/*                                                                         */
7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/*  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;
67a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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  {
86a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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;
142a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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  {
189a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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;
239a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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;
259a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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  {
290a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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  {
319a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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
387a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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;
412a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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;
502a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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;
564a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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    {
590a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      PS_Mask  mask = dim->masks.masks + count - 1;
591a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
592a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
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  {
625a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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  {
650a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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  {
721a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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
795a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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;
806a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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:
819a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      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:
827a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      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  {
898a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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" ));
942a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        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  {
960a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    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 */
983a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang        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