コード例 #1
0
        public static CmapTable Read(FontStreamReader reader, OffsetTable.Entry entry)
        {
            reader.Seek(entry);

            var version = reader.ReadUInt16();

            if (version != 0)
            {
                throw new FormatException($"Unexpected version number in cmap table: {version}, expecting 0");
            }

            var numberOfSubtables = reader.ReadUInt16();

            var subtables = new Dictionary <Tuple <ushort, ushort>, CmapFormat>();

            for (var i = 0; i < numberOfSubtables; i++)
            {
                var platformId         = reader.ReadUInt16();
                var platformSpecificId = reader.ReadUInt16();

                var relOffset = reader.ReadUInt32();
                var offset    = entry.Offset + relOffset;

                var subtable = ReadSubtable(reader, platformId, platformSpecificId, offset);
                subtables.Add(Tuple.Create(platformId, platformSpecificId), subtable);
            }

            return(new CmapTable(version, subtables));
        }
コード例 #2
0
ファイル: LocaTable.cs プロジェクト: longshaoye/Toxon.Fonts
        public static LocaTable Read(Font font, FontStreamReader reader, OffsetTable.Entry entry)
        {
            reader.Seek(entry);

            var length = entry.Length;
            var format = font.HeadTable.IndexToLocFormat;

            switch (format)
            {
            case IndexToLocFormat.Short:
                return(new LocaTable(reader.ReadArray <uint>(length / sizeof(ushort), r => (() => r.ReadUInt16()))));

            case IndexToLocFormat.Long:
                return(new LocaTable(reader.ReadArray <uint>(length / sizeof(uint), r => r.ReadUInt32)));

            default: throw new FormatException($"Invalid IndexToLocFormat: {format}");
            }
        }
コード例 #3
0
ファイル: HeadTable.cs プロジェクト: longshaoye/Toxon.Fonts
        public static HeadTable Read(FontStreamReader reader, OffsetTable.Entry entry)
        {
            reader.Seek(entry);

            var version      = reader.ReadFixed();
            var fontRevision = reader.ReadFixed();

            //TODO
            var checkSumAdjustment = reader.ReadUInt32();

            var magicNumber = reader.ReadUInt32(); // 0x5F0F3CF5

            if (magicNumber != 0x5F0F3CF5)
            {
                throw new FormatException($"Invalid magic number in header: 0x{magicNumber:X}, expecting 0x5F0F3CF5");
            }

            var flags = reader.ReadUInt16();      // bitflags

            var unitsPerEm = reader.ReadUInt16(); // 64-16384

            if (unitsPerEm < 64 || unitsPerEm > 16384)
            {
                throw new FormatException($"Invalid units per em in header: {unitsPerEm:X}, expecting a value between 64 and 16384");
            }

            var created  = reader.ReadLongDateTime();
            var modified = reader.ReadLongDateTime();

            var xMin = reader.ReadFWord();
            var yMin = reader.ReadFWord();
            var xMax = reader.ReadFWord();
            var yMax = reader.ReadFWord();

            var macStyle          = (MacStyle)reader.ReadUInt16(); // bitflags
            var lowestRecPPEM     = reader.ReadUInt16();
            var fontDirectionHint = reader.ReadUInt16();
            var indexToLocFormat  = (IndexToLocFormat)reader.ReadUInt16(); // 0 = short, 1 = long
            var glyphDataFormat   = (GlyphDataFormat)reader.ReadUInt16();  // 0 = current

            return(new HeadTable(version, fontRevision, flags, unitsPerEm, created, modified, xMin, yMin, xMax, yMax, macStyle, lowestRecPPEM, fontDirectionHint, indexToLocFormat, glyphDataFormat));
        }
コード例 #4
0
ファイル: GlyfTable.cs プロジェクト: longshaoye/Toxon.Fonts
        public static GlyfTable Read(FontStreamReader reader, OffsetTable.Entry entry)
        {
            reader.Seek(entry);

            var glyphs = new List <Glyph>();

            while (reader.Position < entry.Offset + entry.Length)
            {
                glyphs.Add(ReadGlyph(reader));

                while ((reader.Position & 1) != 0)
                {
                    reader.ReadUInt8();
                }
            }

            if (reader.Position > entry.Offset + entry.Length)
            {
                throw new Exception("Overflow?");
            }

            return(new GlyfTable(glyphs));
        }