/// <summary>
        /// Creates <see cref="TtfFileInfo"/> from <see cref="System.IO.Stream"/>.
        /// </summary>
        /// <param name="stream">Stream to create the structure. Stream will be disposed after use.</param>
        /// <returns><see cref="TtfFileInfo"/> if successful, otherwise null.</returns>
        public static TtfFileInfo FromStream(Stream stream)
        {
            try
            {
                using (var reader = new BigEndianReader(stream))
                {
                    var ttfFile = new TtfFileInfo()
                    {
                        Version = reader.ReadInt32()
                    };

                    if (ttfFile.Version != 0x74727565 && ttfFile.Version != 0x00010000) return null;

                    ttfFile.TableCount = reader.ReadInt16();
                    reader.BaseStream.Seek(6, SeekOrigin.Current);

                    for (var tableIndex = 0; tableIndex < ttfFile.TableCount; tableIndex++)
                    {
                        var tag = reader.ReadInt32();
                        reader.BaseStream.Seek(4, SeekOrigin.Current);
                        var offset = reader.ReadInt32();
                        var length = reader.ReadInt32();

                        if (tag != 0x6E616D65) continue;

                        reader.BaseStream.Seek(offset, SeekOrigin.Begin);

                        var table = reader.ReadBytes(length);

                        var count = GetInt16(table, 2);
                        var stringOffset = GetInt16(table, 4);

                        for (var record = 0; record < count; record++)
                        {
                            var nameidOffset = record*12 + 6;
                            var platformId = GetInt16(table, nameidOffset);
                            var nameidValue = GetInt16(table, nameidOffset + 6);

                            if (nameidValue != 4 || platformId != 1) continue;

                            var nameLength = GetInt16(table, nameidOffset + 8);
                            var nameOffset = stringOffset + GetInt16(table, nameidOffset + 10);

                            if (nameOffset < 0 || nameOffset + nameLength >= table.Length) continue;

                            ttfFile.FontName = Encoding.UTF8.GetString(table, nameOffset, nameLength);
                            return ttfFile;
                        }
                    }
                }
            }
            catch
            {
                return null;
            }

            return null;
        }
示例#2
0
        /// <summary>
        /// Creates <see cref="TtfFileInfo"/> from <see cref="System.IO.Stream"/>.
        /// </summary>
        /// <param name="stream">Stream to create the structure. Stream will be disposed after use.</param>
        /// <returns><see cref="TtfFileInfo"/> if successful, otherwise null.</returns>
        public static TtfFileInfo FromStream(Stream stream)
        {
            try
            {
                using (var reader = new BigEndianReader(stream))
                {
                    var ttfFile = new TtfFileInfo()
                    {
                        Version = reader.ReadInt32()
                    };

                    if (ttfFile.Version != 0x74727565 && ttfFile.Version != 0x00010000)
                    {
                        return(null);
                    }

                    ttfFile.TableCount = reader.ReadInt16();
                    reader.BaseStream.Seek(6, SeekOrigin.Current);

                    for (var tableIndex = 0; tableIndex < ttfFile.TableCount; tableIndex++)
                    {
                        var tag = reader.ReadInt32();
                        reader.BaseStream.Seek(4, SeekOrigin.Current);
                        var offset = reader.ReadInt32();
                        var length = reader.ReadInt32();

                        if (tag != 0x6E616D65)
                        {
                            continue;
                        }

                        reader.BaseStream.Seek(offset, SeekOrigin.Begin);

                        var table = reader.ReadBytes(length);

                        var count        = GetInt16(table, 2);
                        var stringOffset = GetInt16(table, 4);

                        for (var record = 0; record < count; record++)
                        {
                            var nameidOffset = record * 12 + 6;
                            var platformId   = GetInt16(table, nameidOffset);
                            var nameidValue  = GetInt16(table, nameidOffset + 6);

                            if (nameidValue != 4 || platformId != 1)
                            {
                                continue;
                            }

                            var nameLength = GetInt16(table, nameidOffset + 8);
                            var nameOffset = stringOffset + GetInt16(table, nameidOffset + 10);

                            if (nameOffset < 0 || nameOffset + nameLength >= table.Length)
                            {
                                continue;
                            }

                            ttfFile.FontName = Encoding.UTF8.GetString(table, nameOffset, nameLength);
                            return(ttfFile);
                        }
                    }
                }
            }
            catch
            {
                return(null);
            }

            return(null);
        }