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()); }
public Sprite GetSprite(SpriteIndexInfo info) { if (info.index == -1) { return(null); } return(spriteSet[info.group].spriteSet[info.set].sprites[info.index]); }
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); }