amazfitbiptools/Fonts/Reader.cs

75 lines
2.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using Fonts.Models;
using NLog;
namespace Fonts
{
public class Reader
{
private const int BlockDescriptorLength = 6;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly BinaryReader _binaryReader;
private readonly Stream _stream;
public Reader(Stream stream)
{
_stream = stream;
_binaryReader = new BinaryReader(_stream);
}
public List<BlockDescriptor> Read(uint blocksCount)
{
var descriptorsTableLength = (int) (blocksCount * BlockDescriptorLength);
Logger.Trace("Reading font descriptors table with {0} elements ({1} bytes)",
blocksCount, descriptorsTableLength
);
var descriptors = _binaryReader.ReadBytes(descriptorsTableLength);
var blocks = new List<BlockDescriptor>();
for (var i = 0; i < blocksCount; i++)
{
blocks.Add(new BlockDescriptor
{
StartSymbol = BitConverter.ToChar(descriptors, i * BlockDescriptorLength),
EndSymbol = BitConverter.ToChar(descriptors, i * BlockDescriptorLength + 2),
Offset = BitConverter.ToUInt16(descriptors, i * BlockDescriptorLength + 4)
});
}
return blocks;
}
public Dictionary<char, Bitmap> Read(List<BlockDescriptor> blocks)
{
var imagesOffset = _stream.Position;
Logger.Debug("Reading {0} images...", blocks.Count);
var images = new Dictionary<char, Bitmap>();
for (var i = 0; i < blocks.Count; i++)
{
var block = blocks[i];
var blockOffset = block.Offset;
var realOffset = blockOffset + imagesOffset;
Logger.Trace("Glyphs block {0} offset is {1}...", i, blockOffset);
if (_stream.Position != realOffset)
{
var bytesGap = realOffset - _stream.Position;
Logger.Warn("Found {0} bytes gap before block number {1}", bytesGap, i);
_stream.Seek(realOffset, SeekOrigin.Begin);
}
Logger.Debug("Reading block {0}...", i);
for (var ch = block.StartSymbol; ch <= block.EndSymbol; ch++)
{
images[ch] = new GlyphReader(_stream).Read(16, 16);
// images[ch].Save($"1\\{(int)ch:X4}.png", ImageFormat.Png);
var crc = _stream.ReadByte();
}
}
return images;
}
}
}