Esempio n. 1
0
        private static SpriteIndexInfo[] WriteSprites(BinaryWriter writer, SpriteSetHeader header, List <SpriteEntry> sprites)
        {
            List <SpriteIndexInfo> spriteIndexData = new List <SpriteIndexInfo>();

            int spriteIndex = 0;
            int listIndex   = 0;

            while (listIndex < sprites.Count)
            {
                if (sprites[listIndex].Index == spriteIndex)
                {
                    SpriteIndexInfo spriteWritten = WriteSprite(writer, header, sprites[listIndex].Sprite);
                    spriteIndexData.Add(spriteWritten);
                    ++listIndex;
                }
                else
                {
                    SpriteIndexInfo spriteEmpty = new SpriteIndexInfo(writer.BaseStream.Position);
                    spriteIndexData.Add(spriteEmpty);
                    writer.Write((UInt16)0);
                }

                ++spriteIndex;
            }

            return(spriteIndexData.ToArray());
        }
Esempio n. 2
0
    public Sprite GetSprite(SpriteIndexInfo info)
    {
        if (info.index == -1)
        {
            return(null);
        }

        return(spriteSet[info.group].spriteSet[info.set].sprites[info.index]);
    }
Esempio n. 3
0
        private static SpriteIndexInfo WriteSprite(BinaryWriter writer, SpriteSetHeader header, Bitmap sprite)
        {
            SpriteIndexInfo spriteIndexData = new SpriteIndexInfo();

            spriteIndexData.Width  = sprite.Width;
            spriteIndexData.Height = sprite.Height;
            spriteIndexData.Offset = writer.BaseStream.Position;

            //NOTE(adm244): AGS doesn't support 24bpp RLE compressed images, so we convert them to 32bpp (null alpha)
            // ALSO, AGS seems to treat 24bpp images as RGB while all others as BGR (!)
            // so let's just NOT use 24bpp and convert them to 32bpp
            if (sprite.Format == PixelFormat.Rgb24)
            {
                sprite = sprite.Convert(PixelFormat.Argb32, discardAlpha: true);
            }

            writer.Write((UInt16)sprite.BytesPerPixel);
            writer.Write((UInt16)sprite.Width);
            writer.Write((UInt16)sprite.Height);

            byte[] buffer = sprite.GetPixels();

            if (header.Compression == CompressionType.RLE)
            {
                buffer = CompressRLE(buffer, sprite.Width, sprite.Height, sprite.BytesPerPixel);
            }

            if (header.Version >= 6)
            {
                if (header.Compression == CompressionType.RLE)
                {
                    writer.Write((UInt32)buffer.Length);
                }
            }
            else if (header.Version == 5)
            {
                writer.Write((UInt32)buffer.Length);
            }

            writer.Write((byte[])buffer);

            return(spriteIndexData);
        }