Exemple #1
0
        private static CmapTable ReadCmapTable(string path, FontReader reader, IReadOnlyDictionary <string, TableRecordEntry> entries)
        {
            if (entries.TryGetValue("cmap", out var cmapEntry))
            {
                reader.Seek(cmapEntry.Offset);
                return(CmapTable.FromReader(reader));
            }

            throw new Exception(
                      $"Font {path} does not contain a Character To Glyph Index Mapping Table (cmap)");
        }
Exemple #2
0
        internal Font(FontStreamReader reader, OffsetTable offsetTable)
        {
            this.reader      = reader;
            this.offsetTable = offsetTable;

            HeadTable = HeadTable.Read(reader, offsetTable.Entries["head"]);
            if (offsetTable.Entries.ContainsKey("fpgm"))
            {
                fpgmTable = FpgmTable.Read(reader, offsetTable.Entries["fpgm"]);
            }
            cmapTable = CmapTable.Read(reader, offsetTable.Entries["cmap"]);
            locaTable = LocaTable.Read(this, reader, offsetTable.Entries["loca"]);
            glyfTable = GlyfTable.Read(reader, offsetTable.Entries["glyf"]);

            //TODO run fpgm
        }
Exemple #3
0
 /// <summary>
 /// look up glyph index from input codepoint
 /// </summary>
 /// <param name="codepoint"></param>
 /// <param name="nextCodepoint"></param>
 /// <returns></returns>
 public ushort LookupIndex(int codepoint, int nextCodepoint = 0)
 {
     return(CmapTable.LookupIndex(codepoint, nextCodepoint));
 }
Exemple #4
0
 private TrueTypeFont(string source, OffsetTable offsetTable, IReadOnlyDictionary <string, TableRecordEntry> entries, CmapTable cmapTable, NameTable nameTable, KernTable kernTable)
 {
     this.Source             = source;
     this.OffsetTable        = offsetTable;
     this.TableRecordEntries = entries;
     this.CmapTable          = cmapTable;
     this.NameTable          = nameTable;
     this.KernTable          = kernTable;
 }
        public OpenTypeFont Deserialize(BinaryReader reader)
        {
            var font = new OpenTypeFont {
                SfntVersion = DataTypeConverter.ReadFixed(reader)
            };

            if (!_supportedSfntVersions.Contains(font.SfntVersion))
            {
                throw new NotSupportedException("Bad sfnt version.");
            }

            // Table directory
            var numberOfTables = DataTypeConverter.ReadUShort(reader);

            reader.BaseStream.Position += 3 * DataTypeLength.UShort; // searchRange, entrySelector, rangeShift
            var entryList = Enumerable.Range(0, numberOfTables).Select(i =>
            {
                var entry = new TableDirectoryEntry {
                    Tag = DataTypeConverter.ReadTag(reader)
                };
                reader.BaseStream.Position += DataTypeLength.ULong; // checksum
                entry.Offset = DataTypeConverter.ReadULong(reader);
                entry.Length = DataTypeConverter.ReadULong(reader);
                return(entry);
            }).ToList();

            // Tables
            font.Tables.AddRange(
                entryList.OrderBy(entry => entry.Priority).Select <TableDirectoryEntry, IOpenTypeFontTable>(entry =>
            {
                switch (entry.Tag)
                {
                case "cmap":
                    return(CmapTable.Deserialize(reader, entry.Offset));

                case "head":
                    return(HeadTable.Deserialize(reader, entry.Offset));

                case "maxp":
                    return(MaxpTable.Deserialize(reader, entry.Offset));

                case "loca":
                    return(LocaTable.Deserialize(reader, entry.Offset,
                                                 font.Get <MaxpTable>().NumberOfGlyphs,
                                                 font.Get <HeadTable>().LocaTableVersion));

                case "glyf":
                    return(GlyfTable.Deserialize(reader, entry.Offset, entry.Length,
                                                 font.Get <LocaTable>()));

                case "hhea":
                    return(HheaTable.Deserialize(reader, entry.Offset));

                case "hmtx":
                    return(HmtxTable.Deserialize(reader, entry.Offset, font.Get <HheaTable>().NumberOfHMetrics,
                                                 font.Get <MaxpTable>().NumberOfGlyphs));

                case "post":
                    return(PostTable.Deserialize(reader, entry.Offset));

                default:
                    return(BinaryDataTable.Deserialize(reader, entry.Offset, entry.Length, entry.Tag));
                }
            }));

            return(font);
        }
Exemple #6
0
 public void CollectUnicode(List <uint> unicodes)
 {
     CmapTable.CollectUnicode(unicodes);
 }
Exemple #7
0
 public ushort GetGlyphIndex(int codepoint)
 {
     return(CmapTable.GetGlyphIndex(codepoint, 0, out bool skipNextCodepoint));
 }
Exemple #8
0
 //
 /// <summary>
 /// find glyph index by codepoint
 /// </summary>
 /// <param name="codepoint"></param>
 /// <param name="nextCodepoint"></param>
 /// <returns></returns>
 public ushort GetGlyphIndex(int codepoint, int nextCodepoint = 0)
 {
     return(CmapTable.GetGlyphIndex(codepoint, nextCodepoint));
 }