// uses LangTagCount to read them private IReadOnlyList <LangTagRecord> ReadLangTagRecords(OpenTypeReader reader) { var list = new List <LangTagRecord>(); for (int i = 0; i < LangTagCount; i++) { list.Add(new LangTagRecord { Length = reader.ReadUInt16(), Offset = reader.ReadOffset16() }); } return(list); }
public override void ReadFrom(OpenTypeReader reader, uint length) { Format = (FormatEnum)reader.ReadUInt16(); Count = reader.ReadUInt16(); StringOffset = reader.ReadUInt16(); uint seekOffset = (uint)StringOffset - 6; NameRecords = ReadNameRecords(reader); seekOffset -= Count * NameRecord.Size; if (Format == FormatEnum.LangTagged) { LangTagCount = reader.ReadUInt16(); seekOffset -= 2; LangTagRecords = ReadLangTagRecords(reader); seekOffset -= LangTagCount * LangTagRecord.Size; } reader.BaseStream.Seek(seekOffset, SeekOrigin.Current); var startBase = reader.BaseStream.Position; foreach (var name in NameRecords) { reader.BaseStream.Position = startBase + name.Offset; var nameBytes = reader.ReadBytes(name.Length); // TODO: maybe know how to identify more platforms and encodings? if (name.PlatformID == NameRecord.Platform.Windows || name.PlatformID == NameRecord.Platform.Unicode) { name.Value = Encoding.BigEndianUnicode.GetString(nameBytes); } else { // hope and pray that the encoding is always UTF-8 name.Value = Encoding.UTF8.GetString(nameBytes); } } foreach (var langTag in LangTagRecords) { reader.BaseStream.Position = startBase + langTag.Offset; var nameBytes = reader.ReadBytes(langTag.Length); // hope and pray that the encoding is always UTF-8 langTag.Value = Encoding.UTF8.GetString(nameBytes); } }
// uses Count to read them private IReadOnlyList <NameRecord> ReadNameRecords(OpenTypeReader reader) { var list = new List <NameRecord>(); for (int i = 0; i < Count; i++) { list.Add(new NameRecord { PlatformID = (NameRecord.Platform)reader.ReadUInt16(), EncodingID = reader.ReadUInt16(), LanguageID = reader.ReadUInt16(), NameID = (NameRecord.NameType)reader.ReadUInt16(), Length = reader.ReadUInt16(), Offset = reader.ReadOffset16() }); } return(list); }
public abstract void ReadFrom(OpenTypeReader reader, uint length);