public virtual bool Load(Stream s) { BinaryReader br = new BinaryReader(s); byte[] magic = br.ReadBytes(2); if (magic[0] != (byte)'S' || magic[1] != (byte)'P') { return false; } m_version = br.ReadInt16(); if (m_version != 0x100 && m_version != 0x101 && m_version != 0x200 && m_version != 0x201) { return false; } m_palCount = br.ReadInt16(); if (m_version >= 0x200) m_rgbaCount = br.ReadInt16(); List<RawImage> images = new List<RawImage>(); if (m_palCount > 0) { for (int p = 0; p < m_palCount; p++) { ushort w = br.ReadUInt16(); ushort h = br.ReadUInt16(); int pixelCount = w * h; if (pixelCount > 0) { byte[] data; if (m_version >= 0x201) { data = new byte[pixelCount]; uint next = 0; ushort encoded; encoded = br.ReadUInt16(); while (next < pixelCount && encoded > 0) { byte c = br.ReadByte(); encoded--; if (c == 0) { byte len = br.ReadByte(); encoded--; if (len == 0) len = 1; if (next + len > pixelCount) return false; for (int i = 0; i < len; i++) data[next] = 0; next += len; } else { data[next++] = c; } } if (next != pixelCount || encoded > 0) return false; } else { data = br.ReadBytes(pixelCount); } palData.Add(data); images.Add(new RawImage() { Height = h, Width = w, RawData = data }); } } } if (m_rgbaCount > 0) { for (int p = 0; p < m_rgbaCount; p++) { ushort w = br.ReadUInt16(); ushort h = br.ReadUInt16(); byte[] texData = new byte[w * h * 4]; for (int i = 0; i < texData.Length; i += 4) { // RGBA to ARGB texData[i + 1] = br.ReadByte(); texData[i + 2] = br.ReadByte(); texData[i + 3] = br.ReadByte(); texData[i + 0] = br.ReadByte(); } images.Add(new RawImage() { Height = h, Width = w, RawData = texData }); } } m_images = images.ToArray(); if (m_version >= 0x101) { m_palette = new Palette(); m_palette.Read(br); RemapPalette(); } return true; }
public virtual void SetPalette(Palette p) { m_palette = p; RemapPalette(); }