예제 #1
0
        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);
            }
        }
예제 #2
0
        // 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);
        }
예제 #3
0
        // 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);
        }