package org.apache.fop.fonts.truetype;
import java.io.IOException;
import java.util.List;
import org.apache.fontbox.cff.CFFDataInput;
import org.apache.fontbox.cff.CFFFont;
import org.apache.fontbox.cff.CFFParser;
import org.apache.fontbox.cff.CFFType1Font;
public class OTFFile extends OpenFont {
protected CFFFont fileFont;
public OTFFile() throws IOException {
this(true, false);
}
public OTFFile(boolean useKerning, boolean useAdvanced) throws IOException {
super(useKerning, useAdvanced);
checkForFontbox();
}
private void checkForFontbox() throws IOException {
try {
Class.forName("org.apache.fontbox.cff.CFFFont");
} catch (ClassNotFoundException ex) {
throw new IOException("The Fontbox jar was not found in the classpath. This is "
+ "required for OTF CFF ssupport.");
}
}
@Override
protected void updateBBoxAndOffset() throws IOException {
Object bbox = fileFont.getTopDict().get("FontBBox");
if (bbox != null) {
List bboxList = (List) bbox;
int[] bboxInt = new int[4];
for (int i = 0; i < bboxInt.length; i++) {
bboxInt[i] = (Integer) bboxList.get(i);
}
for (OFMtxEntry o : mtxTab) {
o.setBoundingBox(bboxInt);
}
}
}
private static class Mapping {
private int sid;
private String name;
private byte[] bytes;
public void setSID(int sid) {
this.sid = sid;
}
public int getSID() {
return sid;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setBytes(byte[] bytes) {
this.bytes = bytes;
}
public byte[] getBytes() {
return bytes;
}
}
@Override
protected void initializeFont(FontFileReader in) throws IOException {
fontFile = in;
fontFile.seekSet(0);
CFFParser parser = new CFFParser();
fileFont = parser.parse(in.getAllBytes()).get(0);
embedFontName = fileFont.getName();
}
protected void readName() throws IOException {
Object familyName = fileFont.getTopDict().get("FamilyName");
if (familyName != null && !familyName.equals("")) {
familyNames.add(familyName.toString());
fullName = familyName.toString();
} else {
fullName = fileFont.getName();
familyNames.add(fullName);
}
}
public static byte[] getCFFData(FontFileReader fontFile) throws IOException {
byte[] cff = fontFile.getAllBytes();
CFFDataInput input = new CFFDataInput(fontFile.getAllBytes());
input.readBytes(4);
short numTables = input.readShort();
input.readShort();
input.readShort();
input.readShort();
for (int q = 0; q < numTables; q++) {
String tagName = new String(input.readBytes(4));
readLong(input);
long offset = readLong(input);
long length = readLong(input);
if (tagName.equals("CFF ")) {
cff = new byte[(int)length];
System.arraycopy(fontFile.getAllBytes(), (int)offset, cff, 0, cff.length);
break;
}
}
return cff;
}
private static long readLong(CFFDataInput input) throws IOException {
return (input.readCard16() << 16) | input.readCard16();
}
public boolean isType1() {
return fileFont instanceof CFFType1Font;
}
}