1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  afmparse.c                                                             */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    AFM parser (body).                                                   */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/*  Copyright 2006-2010, 2012, 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#include <ft2build.h>
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_FREETYPE_H
20727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_INTERNAL_DEBUG_H
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_POSTSCRIPT_AUX_H
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "afmparse.h"
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "psconv.h"
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "psauxerr.h"
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    AFM_Stream                                                           */
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib.  */
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  enum
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_STREAM_STATUS_NORMAL,
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_STREAM_STATUS_EOC,
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_STREAM_STATUS_EOL,
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_STREAM_STATUS_EOF
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef struct  AFM_StreamRec_
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Byte*  cursor;
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Byte*  base;
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Byte*  limit;
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int    status;
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } AFM_StreamRec;
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef EOF
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define EOF -1
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#endif
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* this works because empty lines are ignored */
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AFM_IS_NEWLINE( ch )  ( (ch) == '\r' || (ch) == '\n' )
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AFM_IS_EOF( ch )      ( (ch) == EOF  || (ch) == '\x1a' )
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AFM_IS_SPACE( ch )    ( (ch) == ' '  || (ch) == '\t' )
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* column separator; there is no `column' in the spec actually */
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AFM_IS_SEP( ch )      ( (ch) == ';' )
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AFM_GETC()                                                       \
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                                   : EOF )
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AFM_STREAM_KEY_BEGIN( stream )    \
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          (char*)( (stream)->cursor - 1 )
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AFM_STREAM_KEY_LEN( stream, key )       \
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ( (char*)(stream)->cursor - key - 1 )
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AFM_STATUS_EOC( stream ) \
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ( (stream)->status >= AFM_STREAM_STATUS_EOC )
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AFM_STATUS_EOL( stream ) \
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ( (stream)->status >= AFM_STREAM_STATUS_EOL )
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define AFM_STATUS_EOF( stream ) \
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          ( (stream)->status >= AFM_STREAM_STATUS_EOF )
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static int
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_stream_skip_spaces( AFM_Stream  stream )
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    int  ch = 0;  /* make stupid compiler happy */
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( AFM_STATUS_EOC( stream ) )
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return ';';
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( 1 )
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ch = AFM_GETC();
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !AFM_IS_SPACE( ch ) )
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( AFM_IS_NEWLINE( ch ) )
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      stream->status = AFM_STREAM_STATUS_EOL;
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else if ( AFM_IS_SEP( ch ) )
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      stream->status = AFM_STREAM_STATUS_EOC;
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else if ( AFM_IS_EOF( ch ) )
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      stream->status = AFM_STREAM_STATUS_EOF;
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return ch;
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
118049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* read a key or value in current column */
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static char*
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_stream_read_one( AFM_Stream  stream )
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*  str;
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    afm_stream_skip_spaces( stream );
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( AFM_STATUS_EOC( stream ) )
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return NULL;
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    str = AFM_STREAM_KEY_BEGIN( stream );
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( 1 )
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
133727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      int  ch = AFM_GETC();
134727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( AFM_IS_SPACE( ch ) )
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else if ( AFM_IS_NEWLINE( ch ) )
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        stream->status = AFM_STREAM_STATUS_EOL;
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else if ( AFM_IS_SEP( ch ) )
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        stream->status = AFM_STREAM_STATUS_EOC;
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else if ( AFM_IS_EOF( ch ) )
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        stream->status = AFM_STREAM_STATUS_EOF;
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return str;
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* read a string (i.e., read to EOL) */
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static char*
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_stream_read_string( AFM_Stream  stream )
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*  str;
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    afm_stream_skip_spaces( stream );
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( AFM_STATUS_EOL( stream ) )
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return NULL;
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    str = AFM_STREAM_KEY_BEGIN( stream );
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* scan to eol */
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( 1 )
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
175727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      int  ch = AFM_GETC();
176727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
177727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( AFM_IS_NEWLINE( ch ) )
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        stream->status = AFM_STREAM_STATUS_EOL;
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else if ( AFM_IS_EOF( ch ) )
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        stream->status = AFM_STREAM_STATUS_EOF;
186049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
187049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
188049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
189049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return str;
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
192049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
194049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
195049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
196049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    AFM_Parser                                                         */
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
199049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */
201049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  typedef enum  AFM_Token_
202049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ASCENDER,
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_AXISLABEL,
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_AXISTYPE,
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_B,
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_BLENDAXISTYPES,
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_BLENDDESIGNMAP,
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_BLENDDESIGNPOSITIONS,
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_C,
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_CC,
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_CH,
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_CAPHEIGHT,
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_CHARWIDTH,
215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_CHARACTERSET,
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_CHARACTERS,
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_DESCENDER,
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ENCODINGSCHEME,
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ENDAXIS,
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ENDCHARMETRICS,
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ENDCOMPOSITES,
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ENDDIRECTION,
223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ENDFONTMETRICS,
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ENDKERNDATA,
225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ENDKERNPAIRS,
226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ENDTRACKKERN,
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ESCCHAR,
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_FAMILYNAME,
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_FONTBBOX,
230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_FONTNAME,
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_FULLNAME,
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ISBASEFONT,
233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ISCIDFONT,
234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ISFIXEDPITCH,
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ISFIXEDV,
236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_ITALICANGLE,
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_KP,
238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_KPH,
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_KPX,
240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_KPY,
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_L,
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_MAPPINGSCHEME,
243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_METRICSSETS,
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_N,
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_NOTICE,
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_PCC,
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_STARTAXIS,
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_STARTCHARMETRICS,
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_STARTCOMPOSITES,
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_STARTDIRECTION,
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_STARTFONTMETRICS,
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_STARTKERNDATA,
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_STARTKERNPAIRS,
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_STARTKERNPAIRS0,
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_STARTKERNPAIRS1,
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_STARTTRACKKERN,
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_STDHW,
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_STDVW,
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_TRACKKERN,
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_UNDERLINEPOSITION,
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_UNDERLINETHICKNESS,
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_VV,
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_VVECTOR,
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_VERSION,
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_W,
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_W0,
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_W0X,
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_W0Y,
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_W1,
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_W1X,
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_W1Y,
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_WX,
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_WY,
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_WEIGHT,
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_WEIGHTVECTOR,
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_XHEIGHT,
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    N_AFM_TOKENS,
278049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TOKEN_UNKNOWN
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  } AFM_Token;
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
283049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static const char*  const afm_key_table[N_AFM_TOKENS] =
284049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
285049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "Ascender",
286049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "AxisLabel",
287049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "AxisType",
288049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "B",
289049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "BlendAxisTypes",
290049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "BlendDesignMap",
291049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "BlendDesignPositions",
292049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "C",
293049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "CC",
294049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "CH",
295049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "CapHeight",
296049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "CharWidth",
297049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "CharacterSet",
298049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "Characters",
299049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "Descender",
300049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "EncodingScheme",
301049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "EndAxis",
302049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "EndCharMetrics",
303049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "EndComposites",
304049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "EndDirection",
305049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "EndFontMetrics",
306049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "EndKernData",
307049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "EndKernPairs",
308049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "EndTrackKern",
309049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "EscChar",
310049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "FamilyName",
311049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "FontBBox",
312049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "FontName",
313049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "FullName",
314049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "IsBaseFont",
315049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "IsCIDFont",
316049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "IsFixedPitch",
317049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "IsFixedV",
318049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "ItalicAngle",
319049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "KP",
320049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "KPH",
321049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "KPX",
322049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "KPY",
323049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "L",
324049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "MappingScheme",
325049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "MetricsSets",
326049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "N",
327049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "Notice",
328049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "PCC",
329049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "StartAxis",
330049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "StartCharMetrics",
331049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "StartComposites",
332049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "StartDirection",
333049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "StartFontMetrics",
334049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "StartKernData",
335049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "StartKernPairs",
336049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "StartKernPairs0",
337049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "StartKernPairs1",
338049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "StartTrackKern",
339049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "StdHW",
340049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "StdVW",
341049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "TrackKern",
342049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "UnderlinePosition",
343049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "UnderlineThickness",
344049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "VV",
345049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "VVector",
346049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "Version",
347049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "W",
348049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "W0",
349049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "W0X",
350049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "W0Y",
351049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "W1",
352049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "W1X",
353049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "W1Y",
354049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "WX",
355049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "WY",
356049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "Weight",
357049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "WeightVector",
358049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    "XHeight"
359049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  };
360049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
361049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
362049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*
363049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   * `afm_parser_read_vals' and `afm_parser_next_key' provide
364049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   * high-level operations to an AFM_Stream.  The rest of the
365049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   * parser functions should use them without accessing the
366049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   * AFM_Stream directly.
367049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project   */
368049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
369049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Int )
370049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_parser_read_vals( AFM_Parser  parser,
371049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                        AFM_Value   vals,
372295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                        FT_UInt     n )
373049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
374049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_Stream  stream = parser->stream;
375049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*       str;
376295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_UInt     i;
377049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
378049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
379049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( n > AFM_MAX_ARGUMENTS )
380049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return 0;
381049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
382049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( i = 0; i < n; i++ )
383049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
384295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      FT_Offset  len;
385049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      AFM_Value  val = vals + i;
386049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
387049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
388049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( val->type == AFM_VALUE_TYPE_STRING )
389049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        str = afm_stream_read_string( stream );
390049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
391049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        str = afm_stream_read_one( stream );
392049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
393049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !str )
394049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
395049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
396049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      len = AFM_STREAM_KEY_LEN( stream, str );
397049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
398049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( val->type )
399049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
400049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_VALUE_TYPE_STRING:
401049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_VALUE_TYPE_NAME:
402049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
403049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_Memory  memory = parser->memory;
404049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_Error   error;
405049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
406049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
407049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( !FT_QALLOC( val->u.s, len + 1 ) )
408049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
409049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            ft_memcpy( val->u.s, str, len );
410049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            val->u.s[len] = '\0';
411049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
412049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
413049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
414049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
415049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_VALUE_TYPE_FIXED:
416049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str,
417049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                    (FT_Byte*)str + len, 0 );
418049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
419049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
420049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_VALUE_TYPE_INTEGER:
421049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str,
422049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                  (FT_Byte*)str + len );
423049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
424049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
425049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_VALUE_TYPE_BOOL:
426049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        val->u.b = FT_BOOL( len == 4                      &&
427049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                            !ft_strncmp( str, "true", 4 ) );
428049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
429049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
430049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_VALUE_TYPE_INDEX:
431049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( parser->get_index )
432049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          val->u.i = parser->get_index( str, len, parser->user_data );
433049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
434049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          val->u.i = 0;
435049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
436049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
437049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
438049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
439049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return i;
440049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
441049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
442049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
443049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( char* )
444049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_parser_next_key( AFM_Parser  parser,
445049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_Bool     line,
446295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                       FT_Offset*  len )
447049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
448049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_Stream  stream = parser->stream;
449049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*       key    = 0;  /* make stupid compiler happy */
450049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
451049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
452049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( line )
453049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
454049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( 1 )
455049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
456049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* skip current line */
457049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( !AFM_STATUS_EOL( stream ) )
458049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          afm_stream_read_string( stream );
459049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
460049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        stream->status = AFM_STREAM_STATUS_NORMAL;
461049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        key = afm_stream_read_one( stream );
462049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
463049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* skip empty line */
464049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( !key                      &&
465049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             !AFM_STATUS_EOF( stream ) &&
466049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             AFM_STATUS_EOL( stream )  )
467049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          continue;
468049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
469049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
470049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
471049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
472049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
473049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
474049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      while ( 1 )
475049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
476049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* skip current column */
477049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        while ( !AFM_STATUS_EOC( stream ) )
478049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          afm_stream_read_one( stream );
479049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
480049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        stream->status = AFM_STREAM_STATUS_NORMAL;
481049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        key = afm_stream_read_one( stream );
482049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
483049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* skip empty column */
484049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( !key                      &&
485049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             !AFM_STATUS_EOF( stream ) &&
486049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             AFM_STATUS_EOC( stream )  )
487049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          continue;
488049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
489049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
490049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
491049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
492049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
493049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( len )
494295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner      *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key )
495049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     : 0;
496049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
497049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return key;
498049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
499049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
500049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
501049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static AFM_Token
502049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_tokenize( const char*  key,
503295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner                FT_Offset    len )
504049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
505049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    int  n;
506049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
507049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
508049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    for ( n = 0; n < N_AFM_TOKENS; n++ )
509049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
510049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( *( afm_key_table[n] ) == *key )
511049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
512049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        for ( ; n < N_AFM_TOKENS; n++ )
513049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
514049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( *( afm_key_table[n] ) != *key )
515049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            return AFM_TOKEN_UNKNOWN;
516049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
517049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( ft_strncmp( afm_key_table[n], key, len ) == 0 )
518049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            return (AFM_Token) n;
519049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
520049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
521049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
522049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
523049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return AFM_TOKEN_UNKNOWN;
524049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
525049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
526049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
527049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
528049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_parser_init( AFM_Parser  parser,
529049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   FT_Memory   memory,
530049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   FT_Byte*    base,
531049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                   FT_Byte*    limit )
532049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
533aacb8e1368a883fcbc9fe64fd0e460cef9c9b20cNick Kralevich    AFM_Stream  stream = NULL;
534049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error    error;
535049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
536049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
537049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_NEW( stream ) )
538049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      return error;
539049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
540049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    stream->cursor = stream->base = base;
541049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    stream->limit  = limit;
542049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
543049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    /* don't skip the first line during the first call */
544049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    stream->status = AFM_STREAM_STATUS_EOL;
545049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
546049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    parser->memory    = memory;
547049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    parser->stream    = stream;
548049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    parser->FontInfo  = NULL;
549049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    parser->get_index = NULL;
550049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
551727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
552049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
553049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
554049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
555049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL( void )
556049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_parser_done( AFM_Parser  parser )
557049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
558049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory  memory = parser->memory;
559049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
560049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
561049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( parser->stream );
562049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
563049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
564049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
565049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
566049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_parser_read_int( AFM_Parser  parser,
567049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_Int*     aint )
568049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
569049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_ValueRec  val;
570049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
571049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
572049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    val.type = AFM_VALUE_TYPE_INTEGER;
573049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
574049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( afm_parser_read_vals( parser, &val, 1 ) == 1 )
575049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
576049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *aint = val.u.i;
577049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
578727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return FT_Err_Ok;
579049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
580049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
581727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return FT_THROW( Syntax_Error );
582049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
583049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
584049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
585049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
586049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_parse_track_kern( AFM_Parser  parser )
587049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
588049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_FontInfo   fi = parser->FontInfo;
589049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_TrackKern  tk;
590049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*          key;
591295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_Offset      len;
592049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    int            n = -1;
593049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
594049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
595049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( afm_parser_read_int( parser, &fi->NumTrackKern ) )
596049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
597049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
598049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( fi->NumTrackKern )
599049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
600049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Memory  memory = parser->memory;
601049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Error   error;
602049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
603049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
604049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) )
605049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
606049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
607049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
608049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
609049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
610049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      AFM_ValueRec  shared_vals[5];
611049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
612049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
613049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( afm_tokenize( key, len ) )
614049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
615049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_TRACKKERN:
616049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        n++;
617049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
618049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( n >= fi->NumTrackKern )
619049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail;
620049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
621049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        tk = fi->TrackKerns + n;
622049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
623049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        shared_vals[0].type = AFM_VALUE_TYPE_INTEGER;
624049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        shared_vals[1].type = AFM_VALUE_TYPE_FIXED;
625049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        shared_vals[2].type = AFM_VALUE_TYPE_FIXED;
626049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        shared_vals[3].type = AFM_VALUE_TYPE_FIXED;
627049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        shared_vals[4].type = AFM_VALUE_TYPE_FIXED;
628049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 )
629049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail;
630049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
631049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        tk->degree     = shared_vals[0].u.i;
632049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        tk->min_ptsize = shared_vals[1].u.f;
633049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        tk->min_kern   = shared_vals[2].u.f;
634049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        tk->max_ptsize = shared_vals[3].u.f;
635049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        tk->max_kern   = shared_vals[4].u.f;
636049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
637049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
638049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
639049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_ENDTRACKKERN:
640049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_ENDKERNDATA:
641049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_ENDFONTMETRICS:
642049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        fi->NumTrackKern = n + 1;
643727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        return FT_Err_Ok;
644049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
645049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_UNKNOWN:
646049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
647049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
648049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      default:
649049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
650049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
651049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
652049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
653049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
654727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_THROW( Syntax_Error );
655049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
656049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
657049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
658049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  KERN_INDEX
659049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define KERN_INDEX( g1, g2 )  ( ( (FT_ULong)g1 << 16 ) | g2 )
660049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
661049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
662049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* compare two kerning pairs */
663049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_CALLBACK_DEF( int )
664049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_compare_kern_pairs( const void*  a,
665049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                          const void*  b )
666049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
667049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_KernPair  kp1 = (AFM_KernPair)a;
668049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_KernPair  kp2 = (AFM_KernPair)b;
669049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
670049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong  index1 = KERN_INDEX( kp1->index1, kp1->index2 );
671049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong  index2 = KERN_INDEX( kp2->index1, kp2->index2 );
672049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
673049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
6740a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    if ( index1 > index2 )
6750a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      return 1;
6760a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    else if ( index1 < index2 )
6770a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      return -1;
6780a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project    else
6790a9d06e2b5cf75c3d6ba958026bfdf4745f576d6The Android Open Source Project      return 0;
680049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
681049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
682049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
683049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
684049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_parse_kern_pairs( AFM_Parser  parser )
685049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
686049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_FontInfo  fi = parser->FontInfo;
687049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_KernPair  kp;
688049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*         key;
689295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_Offset     len;
690049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    int           n = -1;
691049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
692049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
693049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( afm_parser_read_int( parser, &fi->NumKernPair ) )
694049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
695049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
696049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( fi->NumKernPair )
697049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
698049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Memory  memory = parser->memory;
699049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_Error   error;
700049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
701049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
702049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )
703049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        return error;
704049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
705049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
706049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
707049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
708049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      AFM_Token  token = afm_tokenize( key, len );
709049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
710049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
711049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( token )
712049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
713049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_KP:
714049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_KPX:
715049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_KPY:
716049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
717049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_Int        r;
718049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          AFM_ValueRec  shared_vals[4];
719049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
720049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
721049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          n++;
722049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
723049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( n >= fi->NumKernPair )
724049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
725049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
726049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          kp = fi->KernPairs + n;
727049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
728049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          shared_vals[0].type = AFM_VALUE_TYPE_INDEX;
729049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          shared_vals[1].type = AFM_VALUE_TYPE_INDEX;
730049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          shared_vals[2].type = AFM_VALUE_TYPE_INTEGER;
731049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          shared_vals[3].type = AFM_VALUE_TYPE_INTEGER;
732049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          r = afm_parser_read_vals( parser, shared_vals, 4 );
733049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( r < 3 )
734049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
735049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
736049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          kp->index1 = shared_vals[0].u.i;
737049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          kp->index2 = shared_vals[1].u.i;
738049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( token == AFM_TOKEN_KPY )
739049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
740049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            kp->x = 0;
741049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            kp->y = shared_vals[2].u.i;
742049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
743049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          else
744049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          {
745049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            kp->x = shared_vals[2].u.i;
746049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            kp->y = ( token == AFM_TOKEN_KP && r == 4 )
747049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                      ? shared_vals[3].u.i : 0;
748049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          }
749049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
750049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
751049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
752049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_ENDKERNPAIRS:
753049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_ENDKERNDATA:
754049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_ENDFONTMETRICS:
755049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        fi->NumKernPair = n + 1;
756049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        ft_qsort( fi->KernPairs, fi->NumKernPair,
75741371e1e39c8528eb0c4bc40683c736e6683e60cEric Vannier                  sizeof ( AFM_KernPairRec ),
758049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                  afm_compare_kern_pairs );
759727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        return FT_Err_Ok;
760049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
761049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_UNKNOWN:
762049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
763049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
764049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      default:
765049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
766049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
767049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
768049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
769049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
770727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_THROW( Syntax_Error );
771049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
772049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
773049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
774049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
775049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_parse_kern_data( AFM_Parser  parser )
776049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
777295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_Error   error;
778295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    char*      key;
779295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_Offset  len;
780049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
781049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
782049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
783049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
784049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( afm_tokenize( key, len ) )
785049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
786049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_STARTTRACKKERN:
787049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        error = afm_parse_track_kern( parser );
788049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( error )
789049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return error;
790049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
791049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
792049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_STARTKERNPAIRS:
793049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_STARTKERNPAIRS0:
794049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        error = afm_parse_kern_pairs( parser );
795049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( error )
796049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          return error;
797049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
798049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
799049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_ENDKERNDATA:
800049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_ENDFONTMETRICS:
801727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        return FT_Err_Ok;
802049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
803049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_UNKNOWN:
804049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
805049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
806049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      default:
807049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
808049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
809049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
810049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
811049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
812727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_THROW( Syntax_Error );
813049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
814049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
815049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
816049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  static FT_Error
817049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_parser_skip_section( AFM_Parser  parser,
818049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           FT_UInt     n,
819049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                           AFM_Token   end_section )
820049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
821295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    char*      key;
822295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_Offset  len;
823049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
824049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
825049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( n-- > 0 )
826049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
827049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      key = afm_parser_next_key( parser, 1, NULL );
828049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( !key )
829049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
830049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
831049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
832049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
833049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
834049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      AFM_Token  token = afm_tokenize( key, len );
835049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
836049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
837049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS )
838727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        return FT_Err_Ok;
839049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
840049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
841049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
842727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_THROW( Syntax_Error );
843049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
844049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
845049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
846049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
847049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  afm_parser_parse( AFM_Parser  parser )
848049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
849049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Memory     memory = parser->memory;
850049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    AFM_FontInfo  fi     = parser->FontInfo;
851727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Error      error  = FT_ERR( Syntax_Error );
852049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    char*         key;
853295ffce55e0198e7a9f7d46b33f5c2b4147bf821David 'Digit' Turner    FT_Offset     len;
854049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Int        metrics_sets = 0;
855049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
856049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
857049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !fi )
858727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return FT_THROW( Invalid_Argument );
859049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
860049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    key = afm_parser_next_key( parser, 1, &len );
861049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( !key || len != 16                              ||
862049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project         ft_strncmp( key, "StartFontMetrics", 16 ) != 0 )
863727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease      return FT_THROW( Unknown_File_Format );
864049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
865049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
866049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
867049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      AFM_ValueRec  shared_vals[4];
868049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
869049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
870049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      switch ( afm_tokenize( key, len ) )
871049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
872049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_METRICSSETS:
873049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( afm_parser_read_int( parser, &metrics_sets ) )
874049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail;
875049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
876049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( metrics_sets != 0 && metrics_sets != 2 )
877049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
878727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease          error = FT_THROW( Unimplemented_Feature );
879049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
880049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail;
881049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
882049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
883049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
884049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_ISCIDFONT:
885049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        shared_vals[0].type = AFM_VALUE_TYPE_BOOL;
886049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
887049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail;
888049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
889049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        fi->IsCIDFont = shared_vals[0].u.b;
890049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
891049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
892049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_FONTBBOX:
893049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
894049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        shared_vals[1].type = AFM_VALUE_TYPE_FIXED;
895049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        shared_vals[2].type = AFM_VALUE_TYPE_FIXED;
896049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        shared_vals[3].type = AFM_VALUE_TYPE_FIXED;
897049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 )
898049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail;
899049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
900049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        fi->FontBBox.xMin = shared_vals[0].u.f;
901049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        fi->FontBBox.yMin = shared_vals[1].u.f;
902049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        fi->FontBBox.xMax = shared_vals[2].u.f;
903049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        fi->FontBBox.yMax = shared_vals[3].u.f;
904049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
905049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
906049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_ASCENDER:
907049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
908049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
909049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail;
910049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
911049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        fi->Ascender = shared_vals[0].u.f;
912049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
913049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
914049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_DESCENDER:
915049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
916049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
917049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail;
918049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
919049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        fi->Descender = shared_vals[0].u.f;
920049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
921049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
922049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_STARTCHARMETRICS:
923049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
924049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          FT_Int  n = 0;
925049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
926049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
927049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( afm_parser_read_int( parser, &n ) )
928049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            goto Fail;
929049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
930049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          error = afm_parser_skip_section( parser, n,
931049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                                           AFM_TOKEN_ENDCHARMETRICS );
932049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( error )
933049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            return error;
934049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
935049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
936049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
937049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_STARTKERNDATA:
938049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        error = afm_parse_kern_data( parser );
939049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( error )
940049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto Fail;
941049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        /* fall through since we only support kern data */
942049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
943049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      case AFM_TOKEN_ENDFONTMETRICS:
944727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease        return FT_Err_Ok;
945049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
946049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      default:
947049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        break;
948049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
949049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
950049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
951049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
952049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( fi->TrackKerns );
953049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    fi->NumTrackKern = 0;
954049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
955049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_FREE( fi->KernPairs );
956049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    fi->NumKernPair = 0;
957049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
958049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    fi->IsCIDFont = 0;
959049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
960049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
961049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
962049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
963049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
964049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
965