private TrueTypeFontTable ReadPostscriptTable(uint length, TrueTypeTableEntryList list, BigEndianReader reader)
        {
            PostscriptTable post = new PostscriptTable(reader.Position);

            post.TableVersion       = reader.ReadFixedVersion();
            post.ItalicAngle        = reader.ReadFixed1616();
            post.UnderlinePosition  = reader.ReadInt16();
            post.UnderlineThickness = reader.ReadInt16();
            post.FixedPitch         = reader.ReadUInt32();
            post.MinMemoryOpenType  = reader.ReadUInt32();
            post.MaxMemoryOpenType  = reader.ReadUInt32();
            post.MinMemoryType1     = reader.ReadUInt32();
            post.MaxMemoryType1     = reader.ReadUInt32();


            //TODO: Read the names if correct version.
            if (post.TableVersion == new Version(2, 0))
            {
                List <GlyphName>            glyphnammes = new List <GlyphName>();
                Dictionary <int, GlyphName> offsets     = new Dictionary <int, GlyphName>();

                ushort count = reader.ReadUInt16();
                for (int i = 0; i < count; i++)
                {
                    GlyphName gname = new GlyphName();
                    gname.Index = reader.ReadUInt16();
                    if (gname.Index > 257)
                    {
                        offsets.Add(gname.Index - 258, gname);
                    }
                    glyphnammes.Add(gname);
                }
                post.Names = glyphnammes;

                if (offsets.Count > 0)
                {
                    count = (ushort)offsets.Count;
                    for (int i = 0; i < count; i++)
                    {
                        string    s = reader.ReadPascalString();
                        GlyphName g;
                        if (offsets.TryGetValue(i, out g))
                        {
                            g.Name = s;
                        }
                    }
                }
            }
            else if (post.TableVersion == new Version(2, 5))
            {
            }
            return(post);
        }
        private TrueTypeFontTable ReadFontHeader(uint length, TrueTypeTableEntryList list, BigEndianReader reader)
        {
            FontHeader fh = new FontHeader(reader.Position);

            fh.TableVersion       = reader.ReadFixedVersion();
            fh.FontRevision       = reader.ReadFixedVersion();
            fh.ChecksumAdjustment = reader.ReadUInt32();
            fh.MagicNumber        = reader.ReadUInt32();
            fh.FontFlags          = (FontHeaderFlags)reader.ReadUInt16();
            fh.UnitsPerEm         = reader.ReadUInt16();
            fh.Created            = reader.ReadDateTime();
            fh.Modified           = reader.ReadDateTime();
            fh.XMin                  = reader.ReadInt16();
            fh.YMin                  = reader.ReadInt16();
            fh.XMax                  = reader.ReadInt16();
            fh.YMax                  = reader.ReadInt16();
            fh.MacStyle              = (FontStyleFlags)reader.ReadUInt16();
            fh.SmallestScreenFont    = reader.ReadUInt16();
            fh.DirectionHints        = (FontDirectionFlags)reader.ReadInt16();
            fh.IndexToLocationFormat = (FontIndexLocationFormat)reader.ReadInt16();
            fh.GlyphDataFormat       = (GlyphDataFormat)reader.ReadInt16();
            return(fh);
        }
        private TrueTypeFontTable ReadMaxProfile(uint length, TrueTypeTableEntryList list, BigEndianReader reader)
        {
            long    pos  = reader.Position;
            Version vers = reader.ReadFixedVersion();

            if (vers == new Version(1, 0)) //0x00010000
            {
                MaxTTProfile ttp = new MaxTTProfile(pos);
                ttp.TableVersion              = vers;
                ttp.NumberOfGlyphs            = reader.ReadUInt16();
                ttp.MaxPoints                 = reader.ReadUInt16();
                ttp.MaxContours               = reader.ReadUInt16();
                ttp.MaxCompositePoints        = reader.ReadUInt16();
                ttp.MaxCompositeContours      = reader.ReadUInt16();
                ttp.MaxZones                  = reader.ReadUInt16();
                ttp.MaxTwilightPoints         = reader.ReadUInt16();
                ttp.MaxStorage                = reader.ReadUInt16();
                ttp.MaxFunctionDefinitions    = reader.ReadUInt16();
                ttp.MaxInstructionDefinitions = reader.ReadUInt16();
                ttp.MaxStackComponents        = reader.ReadUInt16();
                ttp.MaxSizeOfInstructions     = reader.ReadUInt16();
                ttp.MaxComponentComponents    = reader.ReadUInt16();
                ttp.MaxComponentDepth         = reader.ReadUInt16();

                return(ttp);
            }
            else if (vers.Major == 0 && vers.Minor == 20480) //0x00005000
            {
                MaxProfile prof = new MaxProfile(pos);
                prof.TableVersion   = MaxPv05;
                prof.NumberOfGlyphs = reader.ReadUInt16();

                return(prof);
            }
            else
            {
                throw new NotSupportedException("The MaxProfile version " + vers.ToString() + " is not supported");
            }
        }
        private TrueTypeFontTable ReadHorizontalHeader(uint length, TrueTypeTableEntryList list, BigEndianReader reader)
        {
            HorizontalHeader hhead = new HorizontalHeader(reader.Position);

            hhead.TableVersion            = reader.ReadFixedVersion();
            hhead.Ascender                = reader.ReadInt16();
            hhead.Descender               = reader.ReadInt16();
            hhead.LineGap                 = reader.ReadInt16();
            hhead.AdvanceWidthMax         = reader.ReadUInt16();
            hhead.MinimumLeftSideBearing  = reader.ReadInt16();
            hhead.MinimumRightSideBearing = reader.ReadInt16();
            hhead.XMaxExtent              = reader.ReadInt16();
            hhead.CaretSlopeRise          = reader.ReadInt16();
            hhead.CaretSlopeRun           = reader.ReadInt16();
            hhead.CaretOffset             = reader.ReadInt16();
            hhead.Reserved1               = reader.ReadInt16();
            hhead.Reserved2               = reader.ReadInt16();
            hhead.Reserved3               = reader.ReadInt16();
            hhead.Reserved4               = reader.ReadInt16();
            hhead.MetricDataFormat        = reader.ReadInt16();
            hhead.NumberOfHMetrics        = reader.ReadUInt16();

            return(hhead);
        }