Exemple #1
0
            public WsaTile(Stream s, Size size, ISpriteFrame prev)
            {
                Size = size;
                var dataLen = s.Length - s.Position;

                Console.WriteLine("dataLen = {0}", dataLen);
                var tempData = StreamExts.ReadBytes(s, (int)dataLen);

                byte[] srcData = new byte[size.Width * size.Height];

                // format80 decompression
                LCWCompression.DecodeInto(tempData, srcData);

                // and format40 decmporession
                Data = new byte[size.Width * size.Height];
                if (prev == null)
                {
                    Array.Clear(Data, 0, Data.Length);
                }
                else
                {
                    Array.Copy(prev.Data, Data, Data.Length);
                }
                XORDeltaCompression.DecodeInto(srcData, Data, 0);
            }
Exemple #2
0
            public CpsD2Tile(Stream s)
            {
                Size = new Size(TileWidth, TileHeight);
                var tempData = StreamExts.ReadBytes(s, (int)(s.Length - s.Position));

                Data = new byte[TileSize];
                LCWCompression.DecodeInto(tempData, Data);
            }
Exemple #3
0
        public void ReadEmbeddedPalette(Stream s)
        {
            paldataByte = StreamExts.ReadBytes(s, 768);

            Stream stream = new MemoryStream(paldataByte);

            CpsPalette = new ImmutablePalette(stream, new int[] { });
        }
Exemple #4
0
        void LoadFrame()
        {
            if (CurrentFrameIndex >= FrameCount)
            {
                return;
            }

            stream.Seek(frameOffsets[CurrentFrameIndex], SeekOrigin.Begin);

            var dataLength = frameOffsets[CurrentFrameIndex + 1] - frameOffsets[CurrentFrameIndex];

            var rawData          = StreamExts.ReadBytes(stream, (int)dataLength);
            var intermediateData = new byte[Width * Height];

            // Format80 decompression
            LCWCompression.DecodeInto(rawData, intermediateData);

            // and Format40 decompression
            currentFramePaletteIndexData = new byte[Width * Height];
            if (previousFramePaletteIndexData == null)
            {
                Array.Clear(currentFramePaletteIndexData, 0, currentFramePaletteIndexData.Length);
            }
            else
            {
                Array.Copy(previousFramePaletteIndexData, currentFramePaletteIndexData, currentFramePaletteIndexData.Length);
            }

            XORDeltaCompression.DecodeInto(intermediateData, currentFramePaletteIndexData, 0);

            var c        = 0;
            var position = 0;

            for (var y = 0; y < Height; y++)
            {
                for (var x = 0; x < Width; x++)
                {
                    var colorIndex = currentFramePaletteIndexData[c++];
                    CurrentFrameData[position++] = paletteBytes[colorIndex * 4];
                    CurrentFrameData[position++] = paletteBytes[colorIndex * 4 + 1];
                    CurrentFrameData[position++] = paletteBytes[colorIndex * 4 + 2];
                    CurrentFrameData[position++] = paletteBytes[colorIndex * 4 + 3];
                }

                // Recalculate the position in the byte array to the start of the next pixel row just in case there is padding in the frame.
                position = (y + 1) * totalFrameWidth * 4;
            }
        }
Exemple #5
0
        void ReadTables(Stream s)
        {
            var start = s.Position;

            s.Position = rtblOffset;
            rtbl       = StreamExts.ReadBytes(s, (int)rtblLength);

            s.Position = rpalOffset;
            rpal       = new byte[rpalLength / 16][];
            for (var i = 0; i < rpal.Length; i++)
            {
                rpal[i] = StreamExts.ReadBytes(s, 16);
            }

            s.Position = start;
        }
Exemple #6
0
        bool IsWsa(Stream s)
        {
            var start = s.Position;

            var frames = s.ReadUInt16();

            if (frames <= 1)             // TODO: find a better way to differentiate .shp icons
            {
                return(false);
            }

            var x      = s.ReadUInt16();
            var y      = s.ReadUInt16();
            var width  = s.ReadUInt16();
            var height = s.ReadUInt16();

            if (width <= 0 || height <= 0)
            {
                return(false);
            }

            var delta = s.ReadUInt16() + 37;

            var flags = s.ReadUInt16();

            var offsets = new uint[frames + 2];

            for (var i = 0; i < offsets.Length; i++)
            {
                offsets[i] = s.ReadUInt32();
            }

            if (flags == 1)
            {
                var palette = StreamExts.ReadBytes(s, 768);
                for (var i = 0; i < offsets.Length; i++)
                {
                    offsets[i] += 768;
                }
            }

            s.Position = start;

            return(s.Length == offsets.Last());
        }
Exemple #7
0
            public IcnD2Tile(Stream s, byte[] palette)
            {
                var tile = StreamExts.ReadBytes(s, TileSize);

                Size = new Size(TileWidth, TileHeight);
                Data = new byte[Size.Width * Size.Height];

                var i = 0;

                for (var y = 0; y < TileHeight; y++)
                {
                    for (var x = 0; x < TileWidth; x += 2)
                    {
                        var val = tile[(y * TileWidth + x) / 2];
                        Data[i++] = palette[val >> 4];
                        Data[i++] = palette[val & 0x0F];
                    }
                }
            }
Exemple #8
0
        void LoadFrame()
        {
            if (currentFrame >= frameCount)
            {
                return;
            }

            stream.Seek(frameOffsets[currentFrame], SeekOrigin.Begin);

            var dataLength = frameOffsets[currentFrame + 1] - frameOffsets[currentFrame];

            var rawData          = StreamExts.ReadBytes(stream, (int)dataLength);
            var intermediateData = new byte[width * height];

            // Format80 decompression
            LCWCompression.DecodeInto(rawData, intermediateData);

            // and Format40 decompression
            currentFrameData = new byte[width * height];
            if (previousFrameData == null)
            {
                Array.Clear(currentFrameData, 0, currentFrameData.Length);
            }
            else
            {
                Array.Copy(previousFrameData, currentFrameData, currentFrameData.Length);
            }

            XORDeltaCompression.DecodeInto(intermediateData, currentFrameData, 0);

            var c         = 0;
            var frameSize = Exts.NextPowerOf2(Math.Max(width, height));

            coloredFrameData = new uint[frameSize, frameSize];
            for (var y = 0; y < height; y++)
            {
                for (var x = 0; x < width; x++)
                {
                    coloredFrameData[y, x] = palette[currentFrameData[c++]];
                }
            }
        }