public void Read(BinaryReader reader, ref Palette_15Bit currentPalette) { FirstByte = reader.ReadByte(); if (FirstByte == 0) { // no data. All else is irrelevant. The whole resource is 1 byte of zero. return; } ImageWidth = reader.ReadInt32(); ImageHeight = reader.ReadInt32(); ImageOffsetX = reader.ReadInt32(); ImageOffsetY = reader.ReadInt32(); ImageHandle = reader.ReadInt32(); PaletteHandle = reader.ReadInt32(); BitsPerPixel = reader.ReadByte(); FrameHeight = reader.ReadByte(); // height comes before width. Why? FrameWidth = reader.ReadByte(); Alignment = reader.ReadByte(); // insanity if (ImageWidth < 0) { throw new InvalidDataException("Unexpected negative number for image width! (Value = {0})".F(ImageWidth)); } if (ImageHeight < 0) { throw new InvalidDataException("Unexpected negative number for image height! (Value = {0})".F(ImageHeight)); } if (FrameWidth < 0) { throw new InvalidDataException("Unexpected negative number for frame width! (Value = {0})".F(FrameWidth)); } if (FrameHeight < 0) { throw new InvalidDataException("Unexpected negative number for frame height! (Value = {0})".F(FrameHeight)); } int pixels = ImageWidth * ImageHeight; if (BitsPerPixel == 8) { ImageData = reader.ReadBytes(pixels); } else if (BitsPerPixel == 16) { ImageData = reader.ReadBytes(pixels * 2); } else { // pixelated insanity throw new InvalidDataException("Unexpected bits per pixel! (Value = {0})".F(BitsPerPixel)); } if (PaletteHandle == 0) { } if (PaletteHandle != 0) { if (BitsPerPixel == 8) { switch (PaletteType) { case PaletteType.EMBEDDED_PALETTE: Memory = reader.ReadInt32(); PaletteHandle2 = reader.ReadInt32(); currentPalette.Read(reader); break; case PaletteType.REFERENCED_PALETTE: break; } } Palette = currentPalette.Clone(); } }