public static GlyphDataTable Load(TrueTypeDataBytes data, TrueTypeHeaderTable table, TableRegister.Builder tableRegister) { data.Seek(table.Offset); var indexToLocationTable = tableRegister.IndexToLocationTable; var offsets = indexToLocationTable.GlyphOffsets; var entryCount = offsets.Length; var glyphCount = entryCount - 1; var glyphs = new IGlyphDescription[glyphCount]; var emptyGlyph = Glyph.Empty(tableRegister.HeaderTable.Bounds); var compositeLocations = new Dictionary <int, TemporaryCompositeLocation>(); for (var i = 0; i < glyphCount; i++) { if (offsets[i] == offsets[i + 1]) { // empty glyph glyphs[i] = emptyGlyph; continue; } data.Seek(offsets[i] + table.Offset); var contourCount = data.ReadSignedShort(); var minX = data.ReadSignedShort(); var minY = data.ReadSignedShort(); var maxX = data.ReadSignedShort(); var maxY = data.ReadSignedShort(); var bounds = new PdfRectangle(minX, minY, maxX, maxY); // If the number of contours is greater than or equal zero it's a simple glyph. if (contourCount >= 0) { glyphs[i] = ReadSimpleGlyph(data, contourCount, bounds); } else { compositeLocations.Add(i, new TemporaryCompositeLocation(data.Position, bounds, contourCount)); } } // Build composite glyphs by combining simple and other composite glyphs. foreach (var compositeLocation in compositeLocations) { glyphs[compositeLocation.Key] = ReadCompositeGlyph(data, compositeLocation.Value, compositeLocations, glyphs, emptyGlyph); } return(new GlyphDataTable(table, glyphs)); }
private IReadOnlyList <IGlyphDescription> ReadGlyphs() { var data = tableBytes; var offsets = glyphOffsets; var entryCount = offsets.Count; var glyphCount = entryCount - 1; var result = new IGlyphDescription[glyphCount]; var emptyGlyph = Glyph.Empty(maxGlyphBounds); var compositeLocations = new Dictionary <int, TemporaryCompositeLocation>(); for (var i = 0; i < glyphCount; i++) { if (offsets[i + 1] <= offsets[i]) { // empty glyph result[i] = emptyGlyph; continue; } data.Seek(offsets[i]); var contourCount = data.ReadSignedShort(); var minX = data.ReadSignedShort(); var minY = data.ReadSignedShort(); var maxX = data.ReadSignedShort(); var maxY = data.ReadSignedShort(); var bounds = new PdfRectangle(minX, minY, maxX, maxY); // If the number of contours is greater than or equal zero it's a simple glyph. if (contourCount >= 0) { result[i] = ReadSimpleGlyph(data, contourCount, bounds); } else { compositeLocations.Add(i, new TemporaryCompositeLocation(data.Position, bounds, contourCount)); } } // Build composite glyphs by combining simple and other composite glyphs. foreach (var compositeLocation in compositeLocations) { result[compositeLocation.Key] = ReadCompositeGlyph(data, compositeLocation.Value, compositeLocations, result, emptyGlyph); } return(result); }