protected override void ReadContentFrom(BinaryReader reader) { ushort verion = reader.ReadUInt16(); ushort nTables = reader.ReadUInt16();//subtable count //TODO: review here if (nTables > 1) { throw new System.NotSupportedException(); } for (int i = 0; i < nTables; ++i) { ushort subTableVersion = reader.ReadUInt16(); ushort len = reader.ReadUInt16(); //Length of the subtable, in bytes (including this header). KernCoverage kerCoverage = new KernCoverage(reader.ReadUInt16()); //What type of information is contained in this table. //The coverage field is divided into the following sub-fields, with sizes given in bits: //---------------------------------------------- switch (kerCoverage.format) { case 0: ReadSubTableFormat0(reader, len - (7 * 2)); //7 fields * 2 byte each break; case 2: //TODO: implement throw new System.NotImplementedException(); default: throw new System.NotSupportedException(); } } }
protected override void ReadContentFrom(BinaryReader reader) { ushort verion = reader.ReadUInt16(); ushort nTables = reader.ReadUInt16();//subtable count //TODO: review here if (nTables > 1) { throw new System.NotSupportedException(); } for (int i = 0; i < nTables; ++i) { ushort subTableVersion = reader.ReadUInt16(); ushort len = reader.ReadUInt16(); //Length of the subtable, in bytes (including this header). KernCoverage kerCoverage = new KernCoverage(reader.ReadUInt16());//What type of information is contained in this table. //The coverage field is divided into the following sub-fields, with sizes given in bits: //---------------------------------------------- switch (kerCoverage.format) { case 0: ReadSubTableFormat0(reader, len - (7 * 2));//7 fields * 2 byte each break; case 2: //TODO: implement throw new System.NotImplementedException(); default: throw new System.NotSupportedException(); } } }
protected override void ReadContentFrom(BinaryReader reader) { ushort verion = reader.ReadUInt16(); ushort nTables = reader.ReadUInt16();//subtable count //TODO: review here if (nTables > 1) { Utils.WarnUnimplemented("Support for {0} kerning tables", nTables); } for (int i = 0; i < nTables; ++i) { ushort subTableVersion = reader.ReadUInt16(); ushort len = reader.ReadUInt16(); //Length of the subtable, in bytes (including this header). KernCoverage kerCoverage = new KernCoverage(reader.ReadUInt16()); //What type of information is contained in this table. //The coverage field is divided into the following sub-fields, with sizes given in bits: //---------------------------------------------- //Format of the subtable. //Only formats 0 and 2 have been defined. //Formats 1 and 3 through 255 are reserved for future use. switch (kerCoverage.format) { case 0: ReadSubTableFormat0(reader, len - (3 * 2)); //3 header field * 2 byte each break; case 2: //TODO: implement default: Utils.WarnUnimplemented("Kerning Coverage Format {0}", kerCoverage.format); break; } } }
public KerningSubTable(int version, KernCoverage coverage, IReadOnlyList <KernPair> pairs) { Version = version; Coverage = coverage; Pairs = pairs; }
private static KerningSubTable ReadFormat2Table(int version, TrueTypeDataBytes data, KernCoverage coverage, long tableStartOffset) { // TODO: Implement and test this; return(null); #pragma warning disable 162 var rowWidth = data.ReadUnsignedShort(); var leftClassTableOffset = data.ReadUnsignedShort(); var rightClassTableOffset = data.ReadUnsignedShort(); var kerningArrayOffset = data.ReadUnsignedShort(); data.Seek(tableStartOffset + leftClassTableOffset); var leftTableFirstGlyph = data.ReadUnsignedShort(); var numberOfLeftGlyphs = data.ReadUnsignedShort(); var leftGlyphClassValues = new int[numberOfLeftGlyphs]; for (var i = 0; i < numberOfLeftGlyphs; i++) { leftGlyphClassValues[i] = data.ReadUnsignedShort(); } data.Seek(tableStartOffset + rightClassTableOffset); var rightTableFirstGlyph = data.ReadUnsignedShort(); var numberOfRightGlyphs = data.ReadUnsignedShort(); var rightGlyphClassValues = new int[numberOfRightGlyphs]; for (var i = 0; i < numberOfRightGlyphs; i++) { rightGlyphClassValues[i] = data.ReadUnsignedShort(); } data.Seek(tableStartOffset + kerningArrayOffset); var pairs = new List <KernPair>(numberOfRightGlyphs * numberOfLeftGlyphs); // Data is a [left glyph count, right glyph count] array: for (int i = 0; i < numberOfLeftGlyphs; i++) { var leftClassValue = leftGlyphClassValues[i]; for (int j = 0; j < numberOfRightGlyphs; j++) { var rightClassValue = rightGlyphClassValues[j]; pairs.Add(new KernPair(leftClassValue, rightClassValue, data.ReadSignedShort())); } } return(new KerningSubTable(version, coverage, pairs)); #pragma warning restore 162 }
private static KerningSubTable ReadFormat0Table(int version, TrueTypeDataBytes data, KernCoverage coverage) { var numberOfPairs = data.ReadUnsignedShort(); // ReSharper disable once UnusedVariable var searchRange = data.ReadUnsignedShort(); // ReSharper disable once UnusedVariable var entrySelector = data.ReadUnsignedShort(); // ReSharper disable once UnusedVariable var rangeShift = data.ReadUnsignedShort(); var pairs = new KernPair[numberOfPairs]; for (int i = 0; i < numberOfPairs; i++) { var leftGlyphIndex = data.ReadUnsignedShort(); var rightGlyphIndex = data.ReadUnsignedShort(); var value = data.ReadSignedShort(); pairs[i] = new KernPair(leftGlyphIndex, rightGlyphIndex, value); } return(new KerningSubTable(version, coverage, pairs)); }