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 += (char)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)((int)args[0]));
//System.err.Println("got it");
} else if (key=="ROS")
fonts[j].isCID = true;
else if (key=="Private") {
fonts[j].privateLength = (int)args[0];
fonts[j].privateOffset = (int)args[1];
}
else if (key=="charset"){
fonts[j].charsetOffset = (int)args[0];
}
else if (key=="Encoding"){
fonts[j].encodingOffset = (int)args[0];
ReadEncoding(fonts[j].encodingOffset);
}
else if (key=="CharStrings") {
fonts[j].charstringsOffset = (int)args[0];
//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 = (int)args[0];
else if (key=="FDSelect")
fonts[j].fdselectOffset = (int)args[0];
else if (key=="CharstringType")
fonts[j].CharstringType = (int)args[0];
}
// 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 begining of the PrivateDict
fonts[j].privateSubrs = (int)args[0]+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] = (int)args[0];
fonts[j].fdprivateOffsets[k] = (int)args[1];
}
}
}
}
}
//System.err.Println("CFF: done");
}