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