// Copyright 2001, FreeHEP.
package org.freehep.graphicsio.font.truetype;
import java.awt.Rectangle;
import java.io.IOException;
/**
* HEAD Table.
*
* @author Simon Fischer
* @version $Id: TTFHeadTable.java,v 1.5 2009-08-17 21:44:45 murkle Exp $
*/
public class TTFHeadTable extends TTFVersionTable {
public static final int FDH_MIXED = 0;
public static final int FDH_LEFT_TO_RIGHT = 1;
public static final int FDH_LEFT_TO_RIGHT_NEUTRAL = 2;
public static final int FDH_RIGHT_TO_LEFT = -1;
public static final int FDH_RIGHT_TO_LEFT_NEUTRAL = -2;
public static final int ITLF_SHORT = 0;
public static final int ITLF_LONG = 1;
public int fontRevisionMinor, fontRevisionMajor;
public long checkSumAdjustment;
public long magicNumber;
public boolean baseline0, sidebearing0, instrDependOnSize, forcePPEM2Int,
instrAlterAdvance;
public int unitsPerEm;
public byte[] created = new byte[8];
public byte[] modified = new byte[8];
public short xMin, yMin, xMax, yMax;
public boolean macBold, macItalic;
public int lowestRecPPEM;
public short fontDirectionHint;
public short indexToLocFormat, glyphDataFormat;
@Override
public String getTag() {
return "head";
}
@Override
public void readTable() throws IOException {
readVersion();
fontRevisionMajor = ttf.readUShort();
fontRevisionMinor = ttf.readUShort();
checkSumAdjustment = ttf.readULong();
magicNumber = ttf.readULong();
ttf.readUShortFlags(); // flags
baseline0 = ttf.flagBit(0);
sidebearing0 = ttf.flagBit(1);
instrDependOnSize = ttf.flagBit(2);
forcePPEM2Int = ttf.flagBit(3);
instrAlterAdvance = ttf.flagBit(4);
unitsPerEm = ttf.readUShort();
ttf.readFully(created);
ttf.readFully(modified);
xMin = ttf.readShort();
yMin = ttf.readShort();
xMax = ttf.readShort();
yMax = ttf.readShort();
ttf.readUShortFlags(); // macstyle
macBold = ttf.flagBit(0);
macItalic = ttf.flagBit(1);
lowestRecPPEM = ttf.readUShort();
fontDirectionHint = ttf.readShort();
indexToLocFormat = ttf.readShort();
if ((indexToLocFormat != ITLF_LONG) && (indexToLocFormat != ITLF_SHORT)) {
System.err.println(
"Unknown value for indexToLocFormat: " + indexToLocFormat);
}
glyphDataFormat = ttf.readShort();
}
@Override
public String toString() {
String str = super.toString() + "\n" + " magicNumber: 0x"
+ Integer.toHexString((int) magicNumber) + " ("
+ (magicNumber == 0x5f0f3cf5 ? "ok" : "wrong") + ")\n";
str += " indexToLocFormat: " + indexToLocFormat + " ";
if (indexToLocFormat == ITLF_LONG) {
str += " (long)\n";
} else if (indexToLocFormat == ITLF_SHORT) {
str += "(short)\n";
} else {
str += "(illegal value)\n";
}
str += " bbox: (" + xMin + "," + yMin + ") : (" + xMax + "," + yMax
+ ")";
return str;
}
public Rectangle getMaxCharBounds() {
return new Rectangle(xMin, yMin, xMax - xMin, yMax - yMin);
}
}