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