Example #1
0
        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();
            }
        }