/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2006 - 2013 Pentaho Corporation and Contributors. All rights reserved. */ package org.pentaho.reporting.libraries.fonts.truetype; import org.pentaho.reporting.libraries.fonts.FontException; import org.pentaho.reporting.libraries.fonts.registry.FontFamily; import org.pentaho.reporting.libraries.fonts.registry.FontIdentifier; import org.pentaho.reporting.libraries.fonts.registry.FontSource; import java.io.IOException; /** * A true-type font record. The record contains meta-information about the font, which allows the system to lookup the * font by one of its names and other style attributes. * <p/> * A font without a 'name' table is rejected. The Name-Table is a mandatory table in the OpenType standard, and only * weird MacOS fonts omit that table. * <p/> * Missing 'head' or 'OS/2' tables are ignored and default values are assumed instead. * * @author Thomas Morgner */ public class TrueTypeFontRecord implements FontSource { private int collectionIndex; private long offset; private boolean bold; private boolean italics; private boolean oblique; private FontFamily family; private boolean embeddable; private boolean nonWindows; // the font does not have an OS2-Table private TrueTypeFontIdentifier identifier; // private FontDataInputSource fontInputSource; private String name; private String variant; public TrueTypeFontRecord( final TrueTypeFont trueTypeFont, final FontFamily family ) throws IOException, FontException { if ( trueTypeFont == null ) { throw new NullPointerException( "The font must not be null" ); } if ( family == null ) { throw new NullPointerException( "The font-family must not be null" ); } this.family = family; this.collectionIndex = trueTypeFont.getCollectionIndex(); this.offset = trueTypeFont.getOffset(); final OS2Table table = (OS2Table) trueTypeFont.getTable( OS2Table.TABLE_ID ); if ( table != null ) { this.embeddable = ( table.isRestricted() == false ); this.nonWindows = false; } else { this.nonWindows = true; } final NameTable nameTable = (NameTable) trueTypeFont.getTable( NameTable.TABLE_ID ); if ( nameTable == null ) { throw new FontException ( "This font does not have a 'name' table. It is not valid." ); } name = nameTable.getPrimaryName( NameTable.NAME_FULLNAME ); // this.allNames = nameTable.getAllNames(NameTable.NAME_FULLNAME); variant = nameTable.getPrimaryName( NameTable.NAME_SUBFAMILY ); // this.allVariants = nameTable.getAllNames(NameTable.NAME_SUBFAMILY); final FontHeaderTable headTable = (FontHeaderTable) trueTypeFont.getTable( FontHeaderTable.TABLE_ID ); if ( headTable != null ) { this.bold = headTable.isBold(); this.italics = headTable.isItalic(); } else { final OS2Table os2Table = (OS2Table) trueTypeFont.getTable( OS2Table.TABLE_ID ); if ( os2Table != null ) { this.bold = os2Table.isBold(); this.italics = os2Table.isItalic(); } else { // try to use the english name instead. If there is no english name, // then do whatever you like. Buggy non standard fonts are not funny .. this.bold = ( variant.toLowerCase().indexOf( "bold" ) >= 0 ); this.italics = ( variant.toLowerCase().indexOf( "italic" ) >= 0 ); } } // A font may declare that it is oblique (which is the poor man's italics // mode), but a font that supports italics is automaticly oblique as well. if ( this.oblique || variant.toLowerCase().indexOf( "oblique" ) >= 0 ) { this.oblique = true; } else { this.oblique = false; } this.identifier = new TrueTypeFontIdentifier ( trueTypeFont.getFilename(), name, variant, collectionIndex, offset, italics, bold ); } public long getOffset() { return offset; } public FontFamily getFamily() { return family; } public boolean isEmbeddable() { return embeddable; } public boolean isBold() { return bold; } public boolean isItalic() { return italics; } public boolean isOblique() { return oblique; } public String getFontSource() { return identifier.getFontSource(); } public int getCollectionIndex() { return collectionIndex; } public boolean equals( final Object o ) { if ( this == o ) { return true; } if ( o == null || getClass() != o.getClass() ) { return false; } final TrueTypeFontRecord that = (TrueTypeFontRecord) o; if ( bold != that.bold ) { return false; } if ( embeddable != that.embeddable ) { return false; } if ( italics != that.italics ) { return false; } if ( oblique != that.oblique ) { return false; } if ( !name.equals( that.name ) ) { return false; } return variant.equals( that.variant ); } /** * This identifies the font resource assigned to this record. * * @return */ public FontIdentifier getIdentifier() { return identifier; } public boolean isNonWindows() { return nonWindows; } public int hashCode() { int result = ( bold ? 1 : 0 ); result = 29 * result + ( italics ? 1 : 0 ); result = 29 * result + ( oblique ? 1 : 0 ); result = 29 * result + ( embeddable ? 1 : 0 ); result = 29 * result + name.hashCode(); result = 29 * result + variant.hashCode(); return result; } }