public static GlyphDataTable Load(TrueTypeDataBytes data, TrueTypeHeaderTable table, HeaderTable headerTable, IndexToLocationTable indexToLocationTable) { data.Seek(table.Offset); var offsets = indexToLocationTable.GlyphOffsets; var entryCount = offsets.Length; var glyphCount = entryCount - 1; var glyphs = new IGlyphDescription[glyphCount]; for (var i = 0; i < glyphCount; i++) { if (offsets[i] == offsets[i + 1]) { // empty glyph 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 TrueTypeGlyphBounds(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 { } } return(new GlyphDataTable(table, glyphs)); }
private static SimpleGlyphDescription ReadSimpleGlyph(TrueTypeDataBytes data, short contourCount, TrueTypeGlyphBounds bounds) { var endPointsOfContours = data.ReadUnsignedShortArray(contourCount); var instructionLength = data.ReadUnsignedShort(); data.ReadByteArray(instructionLength); var pointCount = 0; if (contourCount > 0) { pointCount = endPointsOfContours[contourCount - 1] + 1; } var flags = ReadFlags(data, pointCount); var xCoordinates = ReadCoordinates(data, pointCount, flags, SimpleGlyphFlags.XShortVector, SimpleGlyphFlags.XSignOrSame); var yCoordinates = ReadCoordinates(data, pointCount, flags, SimpleGlyphFlags.YShortVector, SimpleGlyphFlags.YSignOrSame); return(new SimpleGlyphDescription(instructionLength, endPointsOfContours, flags, xCoordinates, yCoordinates)); }