PrtFile LoadImageHeader(Stream s, out Dictionary <int, uint[]> palettes) { var spriteCount = s.ReadUInt32(); var h = new PrtFile() { ImageCount = (int)spriteCount, ImageHeader = new Op2Image[spriteCount] }; palettes = new Dictionary <int, uint[]>(); var rawFrames = h.ImageHeader; for (var f = 0; f < rawFrames.Length; f++) { var paddedWidth = s.ReadUInt32(); var dataOffset = s.ReadUInt32(); var height = s.ReadUInt32(); var width = s.ReadUInt32(); var type = s.ReadUInt16(); var palette = s.ReadUInt16(); palettes.Add(f, framePalettes[palette]); var img = new Op2Image { PaddedWidth = paddedWidth, DataOffset = dataOffset, Height = height, Width = width, ImageType = type, Palette = palette, }; h.ImageHeader[f] = img; } h.AllGroupCount = s.ReadInt32(); h.AllFrameCount = s.ReadInt32(); h.AllPicCount = s.ReadInt32(); h.AllExtInfoCount = s.ReadInt32(); return(h); }
private bool IsPrt(Stream s) { var start = s.Position; var h = new PrtFile() { ID = s.ReadASCII(4), PalCount = s.ReadInt32(), }; if (h.ID != "CPAL") { s.Position = start; return(false); } h.PalData = new Ppal[h.PalCount]; // Parse palettes for (var i = 0; i < h.PalCount; i++) { var ppal = new Ppal { ID = s.ReadASCII(4), Size = s.ReadInt32(), HeadID = s.ReadASCII(4), BytesPerEntry = s.ReadInt32(), Unknown = s.ReadInt32(), DataID = s.ReadASCII(4), PalSize = s.ReadInt32() }; if (ppal.ID != "PPAL" || ppal.HeadID != "head" || ppal.DataID != "data") { s.Position = start; return(false); } var numPaletteEntries = ppal.PalSize / ppal.BytesPerEntry; ppal.PaletteData = new RgbQuad[numPaletteEntries]; // Populate palette for (var j = 0; j < numPaletteEntries; j++) { var rgba = new RgbQuad { Red = s.ReadByte(), Green = s.ReadByte(), Blue = s.ReadByte(), Reserved = s.ReadByte(), }; ppal.PaletteData[j] = rgba; } h.PalData[i] = ppal; } h.ImageCount = s.ReadInt32(); h.ImageHeader = new Op2Image[h.ImageCount]; for (var i = 0; i < h.ImageCount; i++) { var img = new Op2Image { SizeScanline = s.ReadInt32(), }; img.ImgData = s.ReadBytes(img.SizeScanline); img.SizeX = s.ReadInt32(); img.SizeY = s.ReadInt32(); img.Unknown = s.ReadInt16(); img.Palette = s.ReadInt16(); h.ImageHeader[i] = img; } h.AllGroupCount = s.ReadInt32(); h.AllFrameCount = s.ReadInt32(); h.AllPicCount = s.ReadInt32(); h.AllExtInfoCount = s.ReadInt32(); h.Groups = new ImageGroup[h.AllGroupCount]; for (var i = 0; i < h.AllGroupCount; i++) { var img = new ImageGroup { Unknown1 = s.ReadInt32(), SelLeft = s.ReadInt32(), SelTop = s.ReadInt32(), SelRight = s.ReadInt32(), SelBottom = s.ReadInt32(), CenterX = s.ReadInt32(), CenterY = s.ReadInt32(), Unknown8 = s.ReadInt32(), FrameCount = s.ReadInt32() }; img.Frames = new Op2Frame[img.FrameCount]; for (var j = 0; j < img.FrameCount; j++) { var frame = new Op2Frame { PicCount = s.ReadUInt8(), Unknown = s.ReadUInt8(), }; frame.ExtUnknown1 = new BytePair[frame.PicCount >> 7]; for (var k = 0; k < frame.PicCount >> 7; k++) { var bp = new BytePair { Byte1 = s.ReadUInt8(), Byte2 = s.ReadUInt8(), }; frame.ExtUnknown1[k] = bp; } frame.ExtUnknown2 = new BytePair[frame.Unknown >> 7]; for (var k = 0; k < frame.Unknown >> 7; k++) { var bp = new BytePair { Byte1 = s.ReadUInt8(), Byte2 = s.ReadUInt8(), }; frame.ExtUnknown2[k] = bp; } frame.Pictures = new Op2Picture[frame.PicCount & 0x7F]; for (var k = 0; k < frame.Pictures.Length; k++) { var pic = new Op2Picture { ImgNumber = s.ReadInt16(), Reserved = s.ReadUInt8(), PicOrder = s.ReadUInt8(), PosX = s.ReadInt16(), PosY = s.ReadInt16() }; frame.Pictures[k] = pic; } img.Frames[j] = frame; } img.GroupExtCount = s.ReadInt32(); img.Extended = new GroupExt[img.GroupExtCount]; for (var j = 0; j < img.GroupExtCount; j++) { var ext = new GroupExt { Unknown1 = s.ReadInt32(), Unknown2 = s.ReadInt32(), Unknown3 = s.ReadInt32(), Unknown4 = s.ReadInt32(), }; img.Extended[j] = ext; } h.Groups[i] = img; } file = h; return(true); }