Code with Finding: |
class CFFFont {
public CFFFont(RandomAccessFileOrArray inputbuffer) {
//System.err.println("CFF: nStdString = "+standardStrings.length);
buf = inputbuffer;
seek(0);
int major, minor;
major = getCard8();
minor = getCard8();
//System.err.println("CFF Major-Minor = "+major+"-"+minor);
int hdrSize = getCard8();
offSize = getCard8();
//System.err.println("offSize = "+offSize);
//int count, indexOffSize, indexOffset, nextOffset;
nameIndexOffset = hdrSize;
nameOffsets = getIndex(nameIndexOffset);
topdictIndexOffset = nameOffsets[nameOffsets.length-1];
topdictOffsets = getIndex(topdictIndexOffset);
stringIndexOffset = topdictOffsets[topdictOffsets.length-1];
stringOffsets = getIndex(stringIndexOffset);
gsubrIndexOffset = stringOffsets[stringOffsets.length-1];
gsubrOffsets = getIndex(gsubrIndexOffset);
fonts = new Font[nameOffsets.length-1];
// now get the name index
/*
names = new String[nfonts];
privateOffset = new int[nfonts];
charsetOffset = new int[nfonts];
encodingOffset = new int[nfonts];
charstringsOffset = new int[nfonts];
fdarrayOffset = new int[nfonts];
fdselectOffset = new int[nfonts];
*/
for (int j=0; j<nameOffsets.length-1; j++) {
fonts[j] = new Font();
seek(nameOffsets[j]);
fonts[j].name = "";
for (int k=nameOffsets[j]; k<nameOffsets[j+1]; k++) {
fonts[j].name += getCard8();
}
//System.err.println("name["+j+"]=<"+fonts[j].name+">");
}
// string index
//strings = new String[stringOffsets.length-1];
/*
System.err.println("std strings = "+standardStrings.length);
System.err.println("fnt strings = "+(stringOffsets.length-1));
for (char j=0; j<standardStrings.length+(stringOffsets.length-1); j++) {
//seek(stringOffsets[j]);
//strings[j] = "";
//for (int k=stringOffsets[j]; k<stringOffsets[j+1]; k++) {
// strings[j] += (char)getCard8();
//}
System.err.println("j="+(int)j+" <? "+(standardStrings.length+(stringOffsets.length-1)));
System.err.println("strings["+(int)j+"]=<"+getString(j)+">");
}
*/
// top dict
for (int j=0; j<topdictOffsets.length-1; j++) {
seek(topdictOffsets[j]);
while (getPosition() < topdictOffsets[j+1]) {
getDictItem();
if (key=="FullName") {
//System.err.println("getting fullname sid = "+((Integer)args[0]).intValue());
fonts[j].fullName = getString((char)((Integer)args[0]).intValue());
//System.err.println("got it");
} else if (key=="ROS")
fonts[j].isCID = true;
else if (key=="Private") {
fonts[j].privateLength = ((Integer)args[0]).intValue();
fonts[j].privateOffset = ((Integer)args[1]).intValue();
}
else if (key=="charset"){
fonts[j].charsetOffset = ((Integer)args[0]).intValue();
}
// else if (key=="Encoding"){
// int encOffset = ((Integer)args[0]).intValue();
// if (encOffset > 0) {
// fonts[j].encodingOffset = encOffset;
// ReadEncoding(fonts[j].encodingOffset);
// }
// }
else if (key=="CharStrings") {
fonts[j].charstringsOffset = ((Integer)args[0]).intValue();
//System.err.println("charstrings "+fonts[j].charstringsOffset);
// Added by Oren & Ygal
int p = getPosition();
fonts[j].charstringsOffsets = getIndex(fonts[j].charstringsOffset);
seek(p);
} else if (key=="FDArray")
fonts[j].fdarrayOffset = ((Integer)args[0]).intValue();
else if (key=="FDSelect")
fonts[j].fdselectOffset = ((Integer)args[0]).intValue();
else if (key=="CharstringType")
fonts[j].CharstringType = ((Integer)args[0]).intValue();
}
// private dict
if (fonts[j].privateOffset >= 0) {
//System.err.println("PRIVATE::");
seek(fonts[j].privateOffset);
while (getPosition() < fonts[j].privateOffset+fonts[j].privateLength) {
getDictItem();
if (key=="Subrs")
//Add the private offset to the lsubrs since the offset is
// relative to the beginning of the PrivateDict
fonts[j].privateSubrs = ((Integer)args[0]).intValue()+fonts[j].privateOffset;
}
}
// fdarray index
if (fonts[j].fdarrayOffset >= 0) {
int[] fdarrayOffsets = getIndex(fonts[j].fdarrayOffset);
fonts[j].fdprivateOffsets = new int[fdarrayOffsets.length-1];
fonts[j].fdprivateLengths = new int[fdarrayOffsets.length-1];
//System.err.println("FD Font::");
for (int k=0; k<fdarrayOffsets.length-1; k++) {
seek(fdarrayOffsets[k]);
while (getPosition() < fdarrayOffsets[k+1]) {
getDictItem();
if (key=="Private") {
fonts[j].fdprivateLengths[k] = ((Integer)args[0]).intValue();
fonts[j].fdprivateOffsets[k] = ((Integer)args[1]).intValue();
}
}
}
}
}
//System.err.println("CFF: done");
}
}
|