1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  ttmtx.c                                                                */
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
5049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*    Load the metrics tables common to TTF and OTF fonts (body).          */
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/*  Copyright 2006-2009, 2011-2013 by                                      */
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  This file is part of the FreeType project, and may only be used,       */
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  modified, and distributed under the terms of the FreeType project      */
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  this file you indicate that you have read the license and              */
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*  understand and accept it fully.                                        */
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*                                                                         */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/***************************************************************************/
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include <ft2build.h>
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_DEBUG_H
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_INTERNAL_STREAM_H
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include FT_TRUETYPE_TAGS_H
23049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "ttmtx.h"
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#include "sferrors.h"
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
29049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
31049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
32049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* messages during execution.                                            */
33049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
34049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_COMPONENT
35049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_COMPONENT  trace_ttmtx
36049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
37049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
38049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
39049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
40049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    tt_face_load_hmtx                                                  */
42049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
43049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
44049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Load the `hmtx' or `vmtx' table into a face object.                */
45049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
46049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
47049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    face     :: A handle to the target face object.                    */
48049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
49049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    stream   :: The input stream.                                      */
50049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
51049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    vertical :: A boolean flag.  If set, load `vmtx'.                  */
52049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
53049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
54049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
55049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
56049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
57049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  tt_face_load_hmtx( TT_Face    face,
58049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_Stream  stream,
59049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_Bool    vertical )
60049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
61049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error   error;
62049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong   tag, table_size;
63049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong*  ptable_offset;
64049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong*  ptable_size;
65049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
66049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
67049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( vertical )
68049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
69049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      tag           = TTAG_vmtx;
70049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ptable_offset = &face->vert_metrics_offset;
71049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ptable_size   = &face->vert_metrics_size;
72049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
73049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
74049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
75049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      tag           = TTAG_hmtx;
76049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ptable_offset = &face->horz_metrics_offset;
77049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      ptable_size   = &face->horz_metrics_size;
78049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
79049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
80049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    error = face->goto_table( face, tag, stream, &table_size );
81049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( error )
82049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
83049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
84049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *ptable_size   = table_size;
85049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    *ptable_offset = FT_STREAM_POS();
86049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
87049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
88049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
89049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
90049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
91049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
92049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
93049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
94049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
95049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    tt_face_load_hhea                                                  */
96049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
97049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
98049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    Load the `hhea' or 'vhea' table into a face object.                */
99049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
100049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
101049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    face     :: A handle to the target face object.                    */
102049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
103049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    stream   :: The input stream.                                      */
104049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
105049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    vertical :: A boolean flag.  If set, load `vhea'.                  */
106049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
107049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Return>                                                              */
108049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    FreeType error code.  0 means success.                             */
109049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
110049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
111049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  tt_face_load_hhea( TT_Face    face,
112049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_Stream  stream,
113049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                     FT_Bool    vertical )
114049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
115049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error        error;
116049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_HoriHeader*  header;
117049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
118727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    static const FT_Frame_Field  metrics_header_fields[] =
119049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
120049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#undef  FT_STRUCTURE
121049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define FT_STRUCTURE  TT_HoriHeader
122049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
123049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FRAME_START( 36 ),
124049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_ULONG ( Version ),
125049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( Ascender ),
126049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( Descender ),
127049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( Line_Gap ),
128049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_USHORT( advance_Width_Max ),
129049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( min_Left_Side_Bearing ),
130049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( min_Right_Side_Bearing ),
131049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( xMax_Extent ),
132049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( caret_Slope_Rise ),
133049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( caret_Slope_Run ),
134049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( caret_Offset ),
135049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( Reserved[0] ),
136049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( Reserved[1] ),
137049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( Reserved[2] ),
138049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( Reserved[3] ),
139049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_SHORT ( metric_Data_Format ),
140049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        FT_FRAME_USHORT( number_Of_HMetrics ),
141049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      FT_FRAME_END
142049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    };
143049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
144049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
145049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( vertical )
146049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
147049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      void  *v = &face->vertical;
148049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
149049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
150049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = face->goto_table( face, TTAG_vhea, stream, 0 );
151049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
152049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
153049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
154049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      header = (TT_HoriHeader*)v;
155049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
156049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
157049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
158049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      error = face->goto_table( face, TTAG_hhea, stream, 0 );
159049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( error )
160049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        goto Fail;
161049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
162049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      header = &face->horizontal;
163049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
164049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
165049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) )
166049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      goto Fail;
167049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
168049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_TRACE3(( "Ascender:          %5d\n", header->Ascender ));
169049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_TRACE3(( "Descender:         %5d\n", header->Descender ));
170049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics ));
171049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
172049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    header->long_metrics  = NULL;
173049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    header->short_metrics = NULL;
174049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
175049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  Fail:
176049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    return error;
177049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
178049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
179049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
180049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*************************************************************************/
181049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
182049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Function>                                                            */
183049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*    tt_face_get_metrics                                                */
184049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
185049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Description>                                                         */
186ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*    Return the horizontal or vertical metrics in font units for a      */
187ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*    given glyph.  The values are the left side bearing (top side       */
188ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*    bearing for vertical metrics) and advance width (advance height    */
189ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*    for vertical metrics).                                             */
190049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
191049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Input>                                                               */
192ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*    face     :: A pointer to the TrueType face structure.              */
193049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
194ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*    vertical :: If set to TRUE, get vertical metrics.                  */
195ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*                                                                       */
196ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*    gindex   :: The glyph index.                                       */
197049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
198049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /* <Output>                                                              */
199ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*    abearing :: The bearing, either left side or top side.             */
200049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
201ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*    aadvance :: The advance width or advance height, depending on      */
202ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease  /*                the `vertical' flag.                                   */
203049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  /*                                                                       */
204049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  FT_LOCAL_DEF( FT_Error )
205049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  tt_face_get_metrics( TT_Face     face,
206049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_Bool     vertical,
207049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_UInt     gindex,
208049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_Short   *abearing,
209049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project                       FT_UShort  *aadvance )
210049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  {
211049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Error        error;
212049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_Stream       stream = face->root.stream;
213049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    TT_HoriHeader*  header;
214049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_ULong        table_pos, table_size, table_end;
215049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    FT_UShort       k;
216049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
217049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
218049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( vertical )
219049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
220049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      void*  v = &face->vertical;
221049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
222049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
223049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      header     = (TT_HoriHeader*)v;
224049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      table_pos  = face->vert_metrics_offset;
225049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      table_size = face->vert_metrics_size;
226049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
227049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
228049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
229049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      header     = &face->horizontal;
230049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      table_pos  = face->horz_metrics_offset;
231049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      table_size = face->horz_metrics_size;
232049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
233049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
234049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    table_end = table_pos + table_size;
235049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
236049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    k = header->number_Of_HMetrics;
237049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
238049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    if ( k > 0 )
239049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
240049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      if ( gindex < (FT_UInt)k )
241049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
242049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        table_pos += 4 * gindex;
243049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( table_pos + 4 > table_end )
244049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto NoData;
245049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
246049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( FT_STREAM_SEEK( table_pos ) ||
247049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             FT_READ_USHORT( *aadvance ) ||
248049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             FT_READ_SHORT( *abearing )  )
249049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto NoData;
250049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
251049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      else
252049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      {
253049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        table_pos += 4 * ( k - 1 );
254049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( table_pos + 4 > table_end )
255049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto NoData;
256049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
257049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( FT_STREAM_SEEK( table_pos ) ||
258049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project             FT_READ_USHORT( *aadvance ) )
259049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          goto NoData;
260049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
261049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        table_pos += 4 + 2 * ( gindex - k );
262049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        if ( table_pos + 2 > table_end )
263049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          *abearing = 0;
264049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        else
265049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        {
266049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          if ( !FT_STREAM_SEEK( table_pos ) )
267049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project            (void)FT_READ_SHORT( *abearing );
268049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        }
269049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      }
270049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
271049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    else
272049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    {
273049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    NoData:
274049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *abearing = 0;
275049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project      *aadvance = 0;
276049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    }
277049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
278727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    return FT_Err_Ok;
279049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project  }
280049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
281049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
282049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/* END */
283