using System.IO;
using System.Collections.Generic;
namespace fis.Vid.Visuals
{
public class Vinno2DVisual:VinnoVisual
{
///
/// Gets all LogicalCoordinates of this visual.
///
public Dictionary LogicalCoordinates { get; }
///
/// Gets all PhysicalCoordinates of this visual.
///
public Dictionary PhysicalCoordinates { get; }
public Vinno2DVisual()
{
VisualType = VinnoVisualType.V2D;
LogicalCoordinates = new Dictionary();
PhysicalCoordinates = new Dictionary();
}
public override byte[] ToBytes()
{
var baseData = base.ToBytes();
byte[] result;
using (var stream = new MemoryStream())
{
stream.Write(baseData,0, baseData.Length);
var writer = new VinnoStreamWriter(stream);
writer.WriteByte((byte)PhysicalCoordinates.Count);
foreach (var key in PhysicalCoordinates.Keys)
{
writer.WriteByte((byte)key);
writer.WriteBytes(PhysicalCoordinates[key].ToBytes());
}
writer.WriteByte((byte)LogicalCoordinates.Count);
foreach (var key in LogicalCoordinates.Keys)
{
writer.WriteByte((byte)key);
writer.WriteBytes(LogicalCoordinates[key].ToBytes());
}
result = stream.ToArray();
}
return result;
}
public new static VinnoVisual FromBytes(byte[] bytes)
{
Vinno2DVisual result = null;
using (var stream = new MemoryStream(bytes))
{
stream.Position = 0;
var reader = new VinnoStreamReader(stream);
var visualType = (VinnoVisualType)reader.ReadByte();
var displayMode = (VinnoDisplayMode)reader.ReadByte();
if (visualType == VinnoVisualType.V2D)
{
var indicator = (VinnoVisualIndicator) reader.ReadByte();
var activeModeType = (VinnoModeType)reader.ReadByte();
var modeCount = reader.ReadByte();
var modes = new List();
for (var i = 0; i < modeCount; i++)
{
var mode = VinnoMode.FromBytes(reader.ReadBytes());
modes.Add(mode);
}
result = new Vinno2DVisual {Indicator = indicator };
foreach (var mode in modes)
{
result.Modes.Add(mode);
}
result.ActiveModeType = activeModeType;
var physicalCoordinateCount = reader.ReadByte();
var physicalCoordinates = new Dictionary();
for (var i = 0; i < physicalCoordinateCount; i++)
{
var visualAreaType = (VinnoVisualAreaType)reader.ReadByte();
var physicalCoordinate = VinnoPhysicalCoordinate.FromBytes(reader.ReadBytes());
physicalCoordinates.Add(visualAreaType, physicalCoordinate);
}
var logicalCoordinateCount = reader.ReadByte();
var logicalCoordinates = new Dictionary();
for (var i = 0; i < logicalCoordinateCount; i++)
{
var visualAreaType = (VinnoVisualAreaType)reader.ReadByte();
var logicalCoordinate = VinnoLogicalCoordinate.FromBytes(reader.ReadBytes());
logicalCoordinates.Add(visualAreaType, logicalCoordinate);
}
foreach (var key in physicalCoordinates.Keys)
{
result.PhysicalCoordinates.Add(key, physicalCoordinates[key]);
}
foreach (var key in logicalCoordinates.Keys)
{
result.LogicalCoordinates.Add(key, logicalCoordinates[key]);
}
result.DisplayMode = displayMode;
}
}
return result;
}
}
}