public static void SaveTo(Stream stream, FrmFileData result) { using (var writer = new BinaryWriter(stream, System.Text.Encoding.Default, true)) { writer.WriteBE(result.Version); writer.WriteBE(result.Fps); writer.WriteBE(result.ActionFrame); writer.WriteBE(result.FrameCountInEachDirection); foreach (ushort t in result.XShiftPerDirection) { writer.WriteBE(t); } foreach (ushort t in result.YShiftPerDirection) { writer.WriteBE(t); } foreach (uint t in result.FirstFrameOffsetPerDirection) { writer.WriteBE(t); } writer.WriteBE(result.FrameAreaSize); foreach (var frame in result.Frames) { writer.WriteBE(frame.FrameWidth); writer.WriteBE(frame.FrameHeight); writer.WriteBE(frame.FrameSize); writer.WriteBE(frame.XOffset); writer.WriteBE(frame.YOffset); writer.Write(frame.PixelIndexFrames); } writer.Flush(); } }
public static FrmModel ConvertToModel(FrmFileData info, Palette palette) { var result = new FrmModel { Version = (int)info.Version, ActionFrame = info.ActionFrame, Fps = info.Fps, FrameCountInEachDirection = info.FrameCountInEachDirection, }; var frameDirs = GetFrames(info, palette).Batch(result.FrameCountInEachDirection).ToList(); for (int i = 0; i < frameDirs.Count; i++) { var direction = (FrmDirectionType)i; var frameDir = new FrmDirectionModel { Shift = new RVector2(info.XShiftPerDirection[i], info.YShiftPerDirection[i]), FirtsFrameOffset = (int)info.FirstFrameOffsetPerDirection[i], Frames = frameDirs[i].ToList() }; result.Directions.Add(direction, frameDir); } return(result); }
private static IEnumerable <FrameModel> GetFrames(FrmFileData info, Palette palette) { for (int i = 0; i < info.Frames.Count; i++) { var id = i % info.FrameCountInEachDirection + 1; var frame = info.Frames[i]; var bitmap = ConvertToModel(id, frame, palette); yield return(bitmap); } }
public static FrmFileData LoadFrom(Stream stream) { using (var reader = new BinaryReader(stream, System.Text.Encoding.Default, true)) { var result = new FrmFileData { Version = reader.ReadUInt32BE(), Fps = reader.ReadUInt16BE(), ActionFrame = reader.ReadUInt16BE(), FrameCountInEachDirection = reader.ReadUInt16BE(), XShiftPerDirection = new ushort[DirCount] }; for (int i = 0; i < result.XShiftPerDirection.Length; i++) { result.XShiftPerDirection[i] = reader.ReadUInt16BE(); } result.YShiftPerDirection = new ushort[DirCount]; for (int i = 0; i < result.YShiftPerDirection.Length; i++) { result.YShiftPerDirection[i] = reader.ReadUInt16BE(); } result.FirstFrameOffsetPerDirection = new uint[DirCount]; for (int i = 0; i < result.FirstFrameOffsetPerDirection.Length; i++) { result.FirstFrameOffsetPerDirection[i] = reader.ReadUInt32BE(); } result.FrameAreaSize = reader.ReadUInt32BE(); while (reader.BaseStream.Position < reader.BaseStream.Length) { for (int k = 0; k < result.FrameCountInEachDirection; k++) { var frame = new FrameData { FrameWidth = reader.ReadUInt16BE(), FrameHeight = reader.ReadUInt16BE(), FrameSize = reader.ReadUInt32BE(), XOffset = reader.ReadInt16BE(), YOffset = reader.ReadInt16BE() }; var index = reader.ReadBytes((int)frame.FrameSize); frame.PixelIndexFrames = index; result.Frames.Add(frame); } } return(result); } }
public static FrmFileData ConvertToData(FrmModel model) { var result = new FrmFileData { Version = (uint)model.Version, ActionFrame = (ushort)model.ActionFrame, Fps = (ushort)model.Fps, FrameCountInEachDirection = (ushort)model.FrameCountInEachDirection, XShiftPerDirection = new ushort[FrmParser.DirCount], YShiftPerDirection = new ushort[FrmParser.DirCount], FirstFrameOffsetPerDirection = new uint[FrmParser.DirCount] }; foreach (var dir in model.Directions) { var dirIdx = (int)dir.Key; result.XShiftPerDirection[dirIdx] = (ushort)dir.Value.Shift.x; result.YShiftPerDirection[dirIdx] = (ushort)dir.Value.Shift.y; result.FirstFrameOffsetPerDirection[dirIdx] = (uint)dir.Value.FirtsFrameOffset; } var frames = model.Directions.OrderBy(x => x.Key).SelectMany(x => x.Value.Frames); foreach (var frame in frames) { var rframe = new FrameData { FrameWidth = (ushort)frame.Width, FrameHeight = (ushort)frame.Height, FrameSize = (uint)(frame.Width * frame.Height), XOffset = (short)frame.Offset.x, YOffset = (short)frame.Offset.y, PixelIndexFrames = ImageHelper.GetPaletteIndexes(frame.Bitmap) }; result.Frames.Add(rframe); } return(result); }