public PGF Load(Stream FileStream)
{
this.Header = FileStream.ReadStruct<HeaderStruct>();
if (this.Header.Revision >= 3)
{
this.HeaderExtraRevision3 = FileStream.ReadStruct<HeaderRevision3Struct>();
}
FileStream.ReadStructVector(ref DimensionTable, Header.TableDimLength);
FileStream.ReadStructVector(ref XAdjustTable, Header.TableXAdjustLength);
FileStream.ReadStructVector(ref YAdjustTable, Header.TableYAdjustLength);
FileStream.ReadStructVector(ref AdvanceTable, Header.TableAdvanceLength);
PackedShadowCharMap = FileStream.ReadBytes(BitsToBytesHighAligned(Header.TableShadowMapLength * Header.TableShadowMapBpe));
if (Header.Revision == 3)
{
FileStream.ReadStructVector(ref CharmapCompressionTable1, HeaderExtraRevision3.TableCompCharMapLength1);
FileStream.ReadStructVector(ref CharmapCompressionTable2, HeaderExtraRevision3.TableCompCharMapLength2);
}
PackedCharMap = FileStream.ReadBytes(BitsToBytesHighAligned(Header.TableCharMapLength * Header.TableCharMapBpe));
PackedCharPointerTable = FileStream.ReadBytes(BitsToBytesHighAligned(Header.TableCharPointerLength * Header.TableCharPointerBpe));
/*
int BytesLeft = (int)(FileStream.Length - FileStream.Position);
charData = new byte[BytesLeft];
FileStream.Read(charData, 0, BytesLeft);
*/
CharData = FileStream.ReadBytes((int)(FileStream.Length - FileStream.Position));
var NumberOfCharacters = Header.TableCharPointerLength;
CharMap = new int[Header.FirstGlyph + Header.LastGlyph + 1];
CharPointer = new int[NumberOfCharacters];
Glyphs = new Glyph[NumberOfCharacters];
ReverseCharMap = new Dictionary<int, int>();
ShadowCharMap = new Dictionary<int, int>();
ReverseShadowCharMap = new Dictionary<int, int>();
foreach (var Pair in BitReader.FixedBitReader(PackedShadowCharMap, Header.TableShadowMapBpe))
{
var UnicodeIndex = (int)Pair.Key + Header.FirstGlyph;
var GlyphIndex = (int)Pair.Value;
ShadowCharMap[UnicodeIndex] = GlyphIndex;
ReverseShadowCharMap[GlyphIndex] = UnicodeIndex;
}
foreach (var Pair in BitReader.FixedBitReader(PackedCharMap, Header.TableCharMapBpe))
{
var UnicodeIndex = (int)Pair.Key + Header.FirstGlyph;
var GlyphIndex = (int)Pair.Value;
CharMap[UnicodeIndex] = GlyphIndex;
ReverseCharMap[GlyphIndex] = UnicodeIndex;
}
foreach (var Pair in BitReader.FixedBitReader(PackedCharPointerTable, Header.TableCharPointerBpe))
{
CharPointer[Pair.Key] = (int)Pair.Value;
}
/*
for (int n = 0; n < NumberOfCharacters; n++)
{
Glyphs[n] = new Glyph().Read(this, n);
}
*/
Console.WriteLine(this.Header.FontName);
/*
Console.WriteLine(this.header.fontName);
for (int n = 0; n < 300; n++)
{
Console.WriteLine(GetGlyphId((char)n));
}
*/
return this;
}