internal Dictionary<int, int[]> ReadFormat4()
{
Dictionary<int,int[]> h = new Dictionary<int,int[]>();
int table_lenght = rf.ReadUnsignedShort();
rf.SkipBytes(2);
int segCount = rf.ReadUnsignedShort() / 2;
rf.SkipBytes(6);
int[] endCount = new int[segCount];
for (int k = 0; k < segCount; ++k) {
endCount[k] = rf.ReadUnsignedShort();
}
rf.SkipBytes(2);
int[] startCount = new int[segCount];
for (int k = 0; k < segCount; ++k) {
startCount[k] = rf.ReadUnsignedShort();
}
int[] idDelta = new int[segCount];
for (int k = 0; k < segCount; ++k) {
idDelta[k] = rf.ReadUnsignedShort();
}
int[] idRO = new int[segCount];
for (int k = 0; k < segCount; ++k) {
idRO[k] = rf.ReadUnsignedShort();
}
int[] glyphId = new int[table_lenght / 2 - 8 - segCount * 4];
for (int k = 0; k < glyphId.Length; ++k) {
glyphId[k] = rf.ReadUnsignedShort();
}
for (int k = 0; k < segCount; ++k) {
int glyph;
for (int j = startCount[k]; j <= endCount[k] && j != 0xFFFF; ++j) {
if (idRO[k] == 0) {
glyph = (j + idDelta[k]) & 0xFFFF;
}
else {
int idx = k + idRO[k] / 2 - segCount + j - startCount[k];
if (idx >= glyphId.Length)
continue;
glyph = (glyphId[idx] + idDelta[k]) & 0xFFFF;
}
int[] r = new int[2];
r[0] = glyph;
r[1] = GetGlyphWidth(r[0]);
h[fontSpecific ? ((j & 0xff00) == 0xf000 ? j & 0xff : j) : j] = r;
}
}
return h;
}