Example #1
0
        public void GetBufferFrames()
        {
            FileBuffer.Seek(0, SeekOrigin.Begin);
            BinaryFormatter mFormatter = new BinaryFormatter(FileBuffer);
            FlcHeader.ReadData(mFormatter);
            Civ3Header.ReadData(mFormatter);

            SFliFrameHeader frameHeader = new SFliFrameHeader();
            SFliChunkHeader chunkHeader = new SFliChunkHeader();

            mBufferFrames = new byte[FlcHeader.frames + 8][];
            mColourMap = new RGB[FlcHeader.frames + 8][];

            for (short frame = 0; frame < FlcHeader.frames + 8; frame++) {

                mBufferFrames[frame] = new byte[FlcHeader.width * FlcHeader.height];
                mColourMap[frame] = new RGB[256];

                if (frame > 0) {
                    Array.Copy(mBufferFrames[frame - 1], mBufferFrames[frame], sizeof(byte) * (FlcHeader.width * FlcHeader.height));
                    Array.Copy(mColourMap[frame - 1], mColourMap[frame], 256);
                }

                frameHeader.ReadData(mFormatter);

                if (frameHeader.magic != 0xf1fa) {
                    //fseek(fp, frameHeader.Size - sizeof(frameHeader), SEEK_CUR);

                    ulong size = (ulong)System.Runtime.InteropServices.Marshal.SizeOf(typeof(SFliFrameHeader));
                    mFormatter.ReadBytes((int)(frameHeader.size - size));

                    FlcHeader.frames--;
                    frame--;
                    continue;
                }

                for (int chunk = 0; chunk < frameHeader.chunks; chunk++) {
                    chunkHeader.ReadData(mFormatter);

                    switch (chunkHeader.type) {
                        case 4:
                            FlcColour256(mFormatter, frame);
                            break;
                        case 7:
                            long read = FlcDeltaFlc(mFormatter, frame);
                            mFormatter.ReadBytes((int)((long)chunkHeader.size - read));
                            break;
                        case 15:
                            FlcBitwiseRun(mFormatter, frame);
                            break;
                        default:
                            throw new NotImplementedException();

                    }
                }

            }
        }
Example #2
0
        long FlcDeltaFlc(BinaryFormatter formatter, int frame)
        {
            long pos, read;
            short lines, l, b, colour;
            byte skip;
            sbyte change;

            lines = formatter.ReadShort16();

            read = 6 + sizeof(short);

            l = 0;
            while (lines > 0) {
                pos = l * FlcHeader.width;

                b = formatter.ReadShort16();
                read += 2;
                if ((b & 0xC000) == 0x0000) {
                    b &= 0x3FFF;
                    for (int j = 0; j < b; j++) {
                        skip = formatter.ReadByte();
                        pos += skip;
                        read += 1;

                        change = formatter.ReadSByte();
                        read += 1;
                        if (change > 0) {
                            for (int i = 0; i < change; i++) {
                                colour = formatter.ReadShort16();
                                read += 2;
                                mBufferFrames[frame][pos++] = (byte)(colour & 0x00FF);
                                mBufferFrames[frame][pos++] = (byte)((colour >> 8) & 0x00FF);
                            }
                        }
                        else {
                            change = (sbyte)-change;
                            colour = formatter.ReadShort16();
                            read += 2;

                            for (int i = 0; i < change; i++) {
                                mBufferFrames[frame][pos++] = (byte)(colour & 0x00FF);
                                mBufferFrames[frame][pos++] = (byte)((colour >> 8) & 0x00FF);
                            }
                        }
                    }
                    lines--;
                    l++;

                }
                else {
                    if ((b & 0xC000) == 0xC000)
                        l -= b;
                    else
                        mBufferFrames[frame][pos++] = (byte)(b & 0x00FF);

                }
            }

            if ((read % 4) == 1) {
                formatter.ReadBytes(2);
                read++;
            }

            return read;
        }