*
* @throws IOException If there is an error reading the AFM file.
*/
private FontMetric parseFontMetric() throws IOException
{
FontMetric fontMetrics = new FontMetric();
String startFontMetrics = readString();
if( !START_FONT_METRICS.equals( startFontMetrics ) )
{
throw new IOException( "Error: The AFM file should start with " + START_FONT_METRICS +
" and not '" + startFontMetrics + "'" );
}
fontMetrics.setAFMVersion( readFloat() );
String nextCommand = null;
while( !END_FONT_METRICS.equals( (nextCommand = readString() ) ) )
{
if( FONT_NAME.equals( nextCommand ) )
{
fontMetrics.setFontName( readLine() );
}
else if( FULL_NAME.equals( nextCommand ) )
{
fontMetrics.setFullName( readLine() );
}
else if( FAMILY_NAME.equals( nextCommand ) )
{
fontMetrics.setFamilyName( readLine() );
}
else if( WEIGHT.equals( nextCommand ) )
{
fontMetrics.setWeight( readLine() );
}
else if( FONT_BBOX.equals( nextCommand ) )
{
BoundingBox bBox = new BoundingBox();
bBox.setLowerLeftX( readFloat() );
bBox.setLowerLeftY( readFloat() );
bBox.setUpperRightX( readFloat() );
bBox.setUpperRightY( readFloat() );
fontMetrics.setFontBBox( bBox );
}
else if( VERSION.equals( nextCommand ) )
{
fontMetrics.setFontVersion( readLine() );
}
else if( NOTICE.equals( nextCommand ) )
{
fontMetrics.setNotice( readLine() );
}
else if( ENCODING_SCHEME.equals( nextCommand ) )
{
fontMetrics.setEncodingScheme( readLine() );
}
else if( MAPPING_SCHEME.equals( nextCommand ) )
{
fontMetrics.setMappingScheme( readInt() );
}
else if( ESC_CHAR.equals( nextCommand ) )
{
fontMetrics.setEscChar( readInt() );
}
else if( CHARACTER_SET.equals( nextCommand ) )
{
fontMetrics.setCharacterSet( readLine() );
}
else if( CHARACTERS.equals( nextCommand ) )
{
fontMetrics.setCharacters( readInt() );
}
else if( IS_BASE_FONT.equals( nextCommand ) )
{
fontMetrics.setIsBaseFont( readBoolean() );
}
else if( V_VECTOR.equals( nextCommand ) )
{
float[] vector = new float[2];
vector[0] = readFloat();
vector[1] = readFloat();
fontMetrics.setVVector( vector );
}
else if( IS_FIXED_V.equals( nextCommand ) )
{
fontMetrics.setIsFixedV( readBoolean() );
}
else if( CAP_HEIGHT.equals( nextCommand ) )
{
fontMetrics.setCapHeight( readFloat() );
}
else if( X_HEIGHT.equals( nextCommand ) )
{
fontMetrics.setXHeight( readFloat() );
}
else if( ASCENDER.equals( nextCommand ) )
{
fontMetrics.setAscender( readFloat() );
}
else if( DESCENDER.equals( nextCommand ) )
{
fontMetrics.setDescender( readFloat() );
}
else if( STD_HW.equals( nextCommand ) )
{
fontMetrics.setStandardHorizontalWidth( readFloat() );
}
else if( STD_VW.equals( nextCommand ) )
{
fontMetrics.setStandardVerticalWidth( readFloat() );
}
else if( COMMENT.equals( nextCommand ) )
{
fontMetrics.addComment( readLine() );
}
else if( UNDERLINE_POSITION.equals( nextCommand ) )
{
fontMetrics.setUnderlinePosition( readFloat() );
}
else if( UNDERLINE_THICKNESS.equals( nextCommand ) )
{
fontMetrics.setUnderlineThickness( readFloat() );
}
else if( ITALIC_ANGLE.equals( nextCommand ) )
{
fontMetrics.setItalicAngle( readFloat() );
}
else if( CHAR_WIDTH.equals( nextCommand ) )
{
float[] widths = new float[2];
widths[0] = readFloat();
widths[1] = readFloat();
fontMetrics.setCharWidth( widths );
}
else if( IS_FIXED_PITCH.equals( nextCommand ) )
{
fontMetrics.setIsFixedPitch( readBoolean() );
}
else if( START_CHAR_METRICS.equals( nextCommand ) )
{
int count = readInt();
for( int i=0; i<count; i++ )
{
CharMetric charMetric = parseCharMetric();
fontMetrics.addCharMetric( charMetric );
}
String end = readString();
if( !end.equals( END_CHAR_METRICS ) )
{
throw new IOException( "Error: Expected '" + END_CHAR_METRICS + "' actual '" +
end + "'" );
}
}
else if( START_COMPOSITES.equals( nextCommand ) )
{
int count = readInt();
for( int i=0; i<count; i++ )
{
Composite part = parseComposite();
fontMetrics.addComposite( part );
}
String end = readString();
if( !end.equals( END_COMPOSITES ) )
{
throw new IOException( "Error: Expected '" + END_COMPOSITES + "' actual '" +