Example #1
0
        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();
            }
        }
Example #2
0
        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);
        }
Example #3
0
 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);
     }
 }
Example #4
0
        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);
            }
        }
Example #5
0
        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);
        }