internal static CMapTable GetCMAP(Reader reader) { reader.Position = 4; ushort numTables = (ushort)reader.ReadUint16(); ushort searchRange = (ushort)reader.ReadUint16(); ushort entrySelector = (ushort)reader.ReadUint16(); ushort rangeShift = (ushort)reader.ReadUint16(); int offset = -1; int length = -1; for (int i = 0; i < numTables; ++i) { OffsetTable table = new OffsetTable(); table.Read(reader); if (table.Tag == "cmap") { offset = (int)table.Offset; length = (int)table.Length; break; } } CMapTable cmap = new CMapTable(); cmap.Read(reader, offset, length); return(cmap); }
public static Font ReadFromStream(Stream stream) { var font = new Font(); var reader = new BinaryReader(stream); // Offset Table font.OffsetTable = OffsetTable.Read(reader); // Head var headTableRecord = font.OffsetTable.TableRecords.Single(x => x.TableTag == HeadTable.Tag); stream.Seek(headTableRecord.Offset, SeekOrigin.Begin); font.HeadTable = HeadTable.Read(reader); // Horizontal Header var horizontalHeaderTableRecord = font.OffsetTable.TableRecords.Single(x => x.TableTag == HorizontalHeaderTable.Tag); stream.Seek(horizontalHeaderTableRecord.Offset, SeekOrigin.Begin); font.HorizontalHeaderTable = HorizontalHeaderTable.Read(reader); // Maximum Profile var maximumProfileTableRecord = font.OffsetTable.TableRecords.Single(x => x.TableTag == MaximumProfileTableBase.Tag); stream.Seek(maximumProfileTableRecord.Offset, SeekOrigin.Begin); var maximumProfileTableVersion = Math.Round(reader.ReadFixedPointNumber(), 2); if (maximumProfileTableVersion == 0.5m) { font.MaximumProfileTable = MaximumProfileTableV0_5.Read(reader, maximumProfileTableVersion); } else if (maximumProfileTableVersion == 1.0m) { font.MaximumProfileTable = MaximumProfileTableV1.Read(reader, maximumProfileTableVersion); } // Horizontal Metrics var horizontalMetricsTableRecord = font.OffsetTable.TableRecords.Single(x => x.TableTag == HorizontalMetricsTable.Tag); stream.Seek(horizontalMetricsTableRecord.Offset, SeekOrigin.Begin); font.HorizontalMetricsTable = HorizontalMetricsTable.Read(reader, font.HorizontalHeaderTable.NumberOfHMetrics, font.MaximumProfileTable.NumGlyphs); // Glyph var glyphTableRecord = font.OffsetTable.TableRecords.Single(x => x.TableTag == GlyphTable.Tag); font.GlyphTable = new GlyphTable(reader, glyphTableRecord.Offset); // IndexLocation var indexLocationTableRecord = font.OffsetTable.TableRecords.Single(x => x.TableTag == IndexLocationTableBase.Tag); stream.Seek(indexLocationTableRecord.Offset, SeekOrigin.Begin); if (font.HeadTable.IndexToLocFormat == 0) { font.IndexLocationTable = IndexLocationShortFormatTable.Read(reader, font.MaximumProfileTable.NumGlyphs); } else { font.IndexLocationTable = IndexLocationLongFormatTable.Read(reader, font.MaximumProfileTable.NumGlyphs); } // PostScript var postScriptTableRecord = font.OffsetTable.TableRecords.Single(x => x.TableTag == PostScriptTable.Tag); stream.Seek(postScriptTableRecord.Offset, SeekOrigin.Begin); font.PostScriptTable = PostScriptTable.Read(reader); // OS/2 and Windows var os2TableRecord = font.OffsetTable.TableRecords.Single(x => x.TableTag == Os2Table.Tag); stream.Seek(os2TableRecord.Offset, SeekOrigin.Begin); font.Os2Table = Os2Table.Read(reader); // CharacterMap var characterMapTableRecord = font.OffsetTable.TableRecords.Single(x => x.TableTag == CharacterMapTable.Tag); stream.Seek(characterMapTableRecord.Offset, SeekOrigin.Begin); font.CharacterMapTable = CharacterMapTable.Read(reader); return(font); }