Example #1
0
        public Bitmap GetBitmap(Palette_18Bit basePalette, HousePaletteFile housePalette, bool includeFrame, bool makeTransparent, int houseIndex)
        {
            if (PaletteType == PaletteType.EMPTY_ENTRY)
            {
                // at least draw something so it does not error out.
                Bitmap empty = new Bitmap(1, 1);
                empty.MakeTransparent();
                return(empty);
            }

            Bitmap bmp = new Bitmap(ImageWidth, ImageHeight);

            if (BitsPerPixel == 8)
            {
                IPalette pal = (PaletteHandle == 0) ? (IPalette)basePalette.Clone() : Palette.Clone();
                if (houseIndex != -1)
                {
                    pal = housePalette.Merge(pal, houseIndex);
                }

                for (int x = 0; x < ImageWidth; x++)
                {
                    for (int y = 0; y < ImageHeight; y++)
                    {
                        int  pos   = x + y * ImageWidth;
                        byte data8 = ImageData[pos];

                        if (makeTransparent && data8 == 0)
                        {
                            bmp.SetPixel(x, y, Color.Transparent);
                        }
                        else if (makeTransparent && data8 == 1)
                        {
                            bmp.SetPixel(x, y, Color.FromArgb(128, 0, 0, 0));
                        }
                        else
                        {
                            bmp.SetPixel(x, y, pal.Get(data8));
                        }
                    }
                }
            }
            else if (BitsPerPixel == 16)
            {
                // doesn't care about palettes, as its image data is direct color
                for (int x = 0; x < ImageWidth; x++)
                {
                    for (int y = 0; y < ImageHeight; y++)
                    {
                        int    pos    = (x + y * ImageWidth) * 2;
                        ushort data16 = BitConverter.ToUInt16(ImageData, pos);
                        bmp.SetPixel(x, y, Palette_15Bit.ConvertColor(data16));
                    }
                }
            }
            else
            {
                throw new InvalidDataException("Unexpected bits per pixel! (Value = {0})".F(BitsPerPixel));
            }

            if (makeTransparent)
            {
                bmp.MakeTransparent(Palette.Get(0));
            }

            if (includeFrame)
            {
                Bitmap bmpFrame = new Bitmap(FrameWidth, FrameHeight);
                bmpFrame.MakeTransparent();
                Graphics g = Graphics.FromImage(bmpFrame);
                g.DrawImageUnscaled(bmp, new Point((FrameWidth - ImageWidth) / 2, (FrameHeight - ImageHeight) / 2));
                return(bmpFrame);
            }
            else
            {
                return(bmp);
            }
        }
Example #2
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();
            }
        }