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); }
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); }
public void ReadEmbeddedPalette(Stream s) { paldataByte = StreamExts.ReadBytes(s, 768); Stream stream = new MemoryStream(paldataByte); CpsPalette = new ImmutablePalette(stream, new int[] { }); }
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; } }
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; }
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()); }
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]; } } }
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++]]; } } }