public Typeface Read(Stream stream) { var little = BitConverter.IsLittleEndian; using (BinaryReader input = new ByteOrderSwappingBinaryReader(stream)) { UInt32 version = input.ReadUInt32(); UInt16 tableCount = input.ReadUInt16(); UInt16 searchRange = input.ReadUInt16(); UInt16 entrySelector = input.ReadUInt16(); UInt16 rangeShift = input.ReadUInt16(); var tables = new List<TableEntry>(tableCount); for (int i = 0; i < tableCount; i++) { tables.Add(TableEntry.ReadFrom(input)); } var header = Head.From(FindTable(tables, "head")); var maximumProfile = MaxProfile.From(FindTable(tables, "maxp")); var glyphLocations = new GlyphLocations(FindTable(tables, "loca"), maximumProfile.GlyphCount, header.WideGlyphLocations); var glyphs = Glyf.From(FindTable(tables, "glyf"), glyphLocations); var cmaps = CmapReader.From(FindTable(tables,"cmap")); var horizontalHeader = HorizontalHeader.From(FindTable(tables, "hhea")); var horizontalMetrics = HorizontalMetrics.From(FindTable(tables, "hmtx"), horizontalHeader.HorizontalMetricsCount, maximumProfile.GlyphCount); return new Typeface(header.Bounds, header.UnitsPerEm, glyphs, cmaps, horizontalMetrics); } }
internal static List<Glyph> From(TableEntry table, GlyphLocations locations) { var glyphCount = locations.GlyphCount; var glyphs = new List<Glyph>(glyphCount); for (int i = 0; i < glyphCount; i++) { var input = table.GetDataReader(); input.BaseStream.Seek(locations.Offsets[i], SeekOrigin.Current); var length = locations.Offsets[i + 1] - locations.Offsets[i]; if (length > 0) { var contoursCount = input.ReadInt16(); var bounds = BoundsReader.ReadFrom(input); if (contoursCount >= 0) { glyphs.Add(ReadSimpleGlyph(input, contoursCount, bounds)); } else { glyphs.Add(ReadCompositeGlyph(input, -contoursCount, bounds)); } } else { glyphs.Add(Glyph.Empty); } } return glyphs; }
internal static List <Glyph> From(TableEntry table, GlyphLocations locations) { var glyphCount = locations.GlyphCount; var glyphs = new List <Glyph>(glyphCount); var compositeGlyphs = new List <CompositeGlyph>(glyphCount); for (int i = 0; i < glyphCount; i++) { var input = table.GetDataReader(); input.BaseStream.Seek(locations.Offsets[i], SeekOrigin.Current); var length = locations.Offsets[i + 1] - locations.Offsets[i]; if (length > 0) { var contoursCount = input.ReadInt16(); var bounds = BoundsReader.ReadFrom(input); if (contoursCount >= 0) { glyphs.Add(ReadSimpleGlyph(input, contoursCount, bounds)); } else { compositeGlyphs.Add(ReadCompositeGlyph(input, -contoursCount, bounds, glyphs)); glyphs.Add(null); } } else { glyphs.Add(Glyph.Empty); } } // Flatten all composites int c = 0; for (int i = 0; i < glyphs.Count; i++) { if (glyphs[i] == null) { glyphs[i] = compositeGlyphs[c].Flatten(glyphs); c++; } } return(glyphs); }