1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ttmtx.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Load the metrics tables common to TTF and OTF fonts (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Copyright 2006-2009, 2011-2013 by */ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This file is part of the FreeType project, and may only be used, */ 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* modified, and distributed under the terms of the FreeType project */ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* this file you indicate that you have read the license and */ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* understand and accept it fully. */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/ft2build.h" 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftdebug.h" 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftstream.h" 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/tttags.h" 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttmtx.h" 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "sferrors.h" 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* messages during execution. */ 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_COMPONENT 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT trace_ttmtx 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* tt_face_load_hmtx */ 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Load the `hmtx' or `vmtx' table into a face object. */ 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* face :: A handle to the target face object. */ 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* stream :: The input stream. */ 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* vertical :: A boolean flag. If set, load `vmtx'. */ 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FreeType error code. 0 means success. */ 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Error ) 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_hmtx( TT_Face face, 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bool vertical ) 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong tag, table_size; 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong* ptable_offset; 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong* ptable_size; 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( vertical ) 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tag = TTAG_vmtx; 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ptable_offset = &face->vert_metrics_offset; 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ptable_size = &face->vert_metrics_size; 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tag = TTAG_hmtx; 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ptable_offset = &face->horz_metrics_offset; 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ptable_size = &face->horz_metrics_size; 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = face->goto_table( face, tag, stream, &table_size ); 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if 0 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Fail; 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *ptable_size = table_size; 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *ptable_offset = FT_STREAM_POS(); 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Fail: 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *ptable_size = error ? 0 : table_size; 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *ptable_offset = FT_STREAM_POS(); 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* tt_face_load_hhea */ 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Load the `hhea' or 'vhea' table into a face object. */ 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* face :: A handle to the target face object. */ 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* stream :: The input stream. */ 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* vertical :: A boolean flag. If set, load `vhea'. */ 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Return> */ 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* FreeType error code. 0 means success. */ 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Error ) 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_load_hhea( TT_Face face, 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream, 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bool vertical ) 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_HoriHeader* header; 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static const FT_Frame_Field metrics_header_fields[] = 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_STRUCTURE 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_STRUCTURE TT_HoriHeader 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_START( 36 ), 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_ULONG ( Version ), 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( Ascender ), 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( Descender ), 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( Line_Gap ), 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_USHORT( advance_Width_Max ), 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( min_Left_Side_Bearing ), 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( min_Right_Side_Bearing ), 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( xMax_Extent ), 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( caret_Slope_Rise ), 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( caret_Slope_Run ), 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( caret_Offset ), 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( Reserved[0] ), 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( Reserved[1] ), 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( Reserved[2] ), 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( Reserved[3] ), 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_SHORT ( metric_Data_Format ), 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_USHORT( number_Of_HMetrics ), 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FRAME_END 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov }; 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( vertical ) 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void *v = &face->vertical; 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = face->goto_table( face, TTAG_vhea, stream, 0 ); 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Fail; 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov header = (TT_HoriHeader*)v; 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = face->goto_table( face, TTAG_hhea, stream, 0 ); 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( error ) 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Fail; 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov header = &face->horizontal; 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) ) 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto Fail; 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE3(( "Ascender: %5d\n", header->Ascender )); 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE3(( "Descender: %5d\n", header->Descender )); 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics )); 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov header->long_metrics = NULL; 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov header->short_metrics = NULL; 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Fail: 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Function> */ 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* tt_face_get_metrics */ 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Description> */ 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* Returns the horizontal or vertical metrics in font units for a */ 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* given glyph. The metrics are the left side bearing (resp. top */ 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* side bearing) and advance width (resp. advance height). */ 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Input> */ 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* header :: A pointer to either the horizontal or vertical metrics */ 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* structure. */ 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* idx :: The glyph index. */ 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* <Output> */ 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* bearing :: The bearing, either left side or top side. */ 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* advance :: The advance width resp. advance height. */ 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_LOCAL_DEF( FT_Error ) 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tt_face_get_metrics( TT_Face face, 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Bool vertical, 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt gindex, 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Short *abearing, 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UShort *aadvance ) 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Stream stream = face->root.stream; 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov TT_HoriHeader* header; 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_ULong table_pos, table_size, table_end; 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UShort k; 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( vertical ) 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov void* v = &face->vertical; 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov header = (TT_HoriHeader*)v; 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table_pos = face->vert_metrics_offset; 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table_size = face->vert_metrics_size; 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov header = &face->horizontal; 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table_pos = face->horz_metrics_offset; 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table_size = face->horz_metrics_size; 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table_end = table_pos + table_size; 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov k = header->number_Of_HMetrics; 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( k > 0 ) 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( gindex < (FT_UInt)k ) 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table_pos += 4 * gindex; 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( table_pos + 4 > table_end ) 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto NoData; 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_STREAM_SEEK( table_pos ) || 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_READ_USHORT( *aadvance ) || 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_READ_SHORT( *abearing ) ) 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto NoData; 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table_pos += 4 * ( k - 1 ); 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( table_pos + 4 > table_end ) 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto NoData; 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_STREAM_SEEK( table_pos ) || 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_READ_USHORT( *aadvance ) ) 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov goto NoData; 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov table_pos += 4 + 2 * ( gindex - k ); 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( table_pos + 2 > table_end ) 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *abearing = 0; 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !FT_STREAM_SEEK( table_pos ) ) 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov (void)FT_READ_SHORT( *abearing ); 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov else 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov NoData: 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *abearing = 0; 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *aadvance = 0; 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_Err_Ok; 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 287