// Copyright 2001, FreeHEP.
package org.freehep.graphicsio.font.truetype;
import com.google.code.appengine.awt.Rectangle;
import java.io.IOException;
/**
* HEAD Table.
*
* @author Simon Fischer
* @version $Id: TTFHeadTable.java 8584 2006-08-10 23:06:37Z duns $
*/
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;
public String getTag() {
return "head";
}
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();
}
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);
}
}