Added warning for not supported colors on extracting images

fonts_experiment
Valeriy Mironov 2017-11-25 12:58:08 +02:00
parent 68274901de
commit ce8bcabd50
3 changed files with 21 additions and 14 deletions

View File

@ -15,7 +15,7 @@ namespace Resources
private Color[] _palette;
private ushort _paletteColors;
private ushort _rowLengthInBytes;
private ushort _transparency;
private bool _transparency;
private ushort _width;
public ImageReader(Stream stream)
@ -42,7 +42,7 @@ namespace Resources
_rowLengthInBytes = _reader.ReadUInt16();
_bitsPerPixel = _reader.ReadUInt16();
_paletteColors = _reader.ReadUInt16();
_transparency = _reader.ReadUInt16();
_transparency = _reader.ReadUInt16() > 0;
Logger.Trace("Image header was read:");
Logger.Trace("Width: {0}, Height: {1}, RowLength: {2}", _width, _height, _rowLengthInBytes);
Logger.Trace("BPP: {0}, PaletteColors: {1}, Transaparency: {2}",
@ -57,14 +57,20 @@ namespace Resources
for (var i = 0; i < _paletteColors; i++)
{
var r = _reader.ReadByte();
if (r != 0 && r != 0xff) Logger.Warn("Palette item {0} R value isn't supported: {1:X2}", i, r);
var g = _reader.ReadByte();
if (g != 0 && g != 0xff) Logger.Warn("Palette item {0} G value isn't supported: {1:X2}", i, g);
var b = _reader.ReadByte();
var a = _reader.ReadByte();
Logger.Trace("Palette item {0}: R {1:x2}, G {2:x2}, B {3:x2}, A {4:x2}", i, r, g, b, a);
if (b != 0 && b != 0xff) Logger.Warn("Palette item {0} B value isn't supported: {1:X2}", i, b);
var color = _transparency > 0 && i == 0 ? Color.Transparent : Color.FromArgb(0xff, r, g, b);
var padding = _reader.ReadByte(); // always 0 maybe padding
if (padding != 0) Logger.Warn("Palette item {0} last byte is not zero: {1:X2}", i, padding);
_palette[i] = color;
Logger.Trace("Palette item {0}: R {1:X2}, G {2:X2}, B {3:X2}", i, r, g, b);
_palette[i] = Color.FromArgb(_transparency && i == 0 ? 0x00 : 0xff, r, g, b);
}
}

View File

@ -28,7 +28,7 @@ namespace Resources
var imagesOffsets = _binaryReader.ReadBytes(offsetsTableLength);
var imagesOffset = _stream.Position;
Logger.Trace("Reading {0} resources", imagesTableLength);
Logger.Debug("Reading {0} images...", imagesTableLength);
var images = new Bitmap[imagesTableLength];
for (var i = 0; i < imagesTableLength; i++)
{
@ -39,6 +39,7 @@ namespace Resources
Logger.Warn("Found {0} bytes gap before resource number {1}", bytesGap, i);
_stream.Seek(imageOffset, SeekOrigin.Begin);
}
Logger.Debug("Reading image {0}...", i);
images[i] = new ImageReader(_stream).Read();
}
return images;

View File

@ -11,11 +11,11 @@ namespace WatchFace.Parser
{
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly FileStream _fileStream;
private readonly Stream _stream;
public Reader(FileStream streamReader)
public Reader(Stream stream)
{
_fileStream = streamReader;
_stream = stream;
}
public List<Parameter> Parameters { get; private set; }
@ -24,7 +24,7 @@ namespace WatchFace.Parser
public void Read()
{
Logger.Trace("Reading header...");
var header = Header.ReadFrom(_fileStream);
var header = Header.ReadFrom(_stream);
Logger.Trace("Header was read:");
Logger.Trace("Signature: {0}, Unknown: {1}, ParametersSize: {2}, IsValid: {3}", header.Signature,
header.Unknown,
@ -32,7 +32,7 @@ namespace WatchFace.Parser
if (!header.IsValid) return;
Logger.Trace("Reading parameter offsets...");
var parametersStream = StreamBlock(_fileStream, (int) header.ParametersSize);
var parametersStream = StreamBlock(_stream, (int) header.ParametersSize);
Logger.Trace("Parameter offsets were read from file");
Logger.Trace("Reading parameters descriptor...");
@ -47,13 +47,13 @@ namespace WatchFace.Parser
Logger.Trace("Watch face parameters locations were read:");
Parameters = ReadParameters(parametrsTableLength, parametersLocations);
Images = new ResourcesReader(_fileStream).Read((uint) imagesCount);
Images = new ResourcesReader(_stream).Read((uint) imagesCount);
}
private List<Parameter> ReadParameters(long coordinatesTableSize,
IReadOnlyCollection<Parameter> parametersDescriptors)
{
var parametersStream = StreamBlock(_fileStream, (int) coordinatesTableSize);
var parametersStream = StreamBlock(_stream, (int) coordinatesTableSize);
var result = new List<Parameter>(parametersDescriptors.Count);
foreach (var prameterDescriptor in parametersDescriptors)