using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using MLEM.Misc; using MLEM.Textures; namespace MLEM.Extensions { /// /// A set of extensions for dealing with /// public static class SpriteBatchExtensions { private static Texture2D blankTexture; /// /// Returns a 1x1 pixel white texture that can be used for drawing solid color shapes. /// This texture is automatically disposed of when the batch is disposed. /// /// The sprite batch /// A 1x1 pixel white texture public static Texture2D GetBlankTexture(this SpriteBatch batch) { if (blankTexture == null) { blankTexture = new Texture2D(batch.GraphicsDevice, 1, 1); blankTexture.SetData(new[] {Color.White}); batch.Disposing += (sender, args) => { if (blankTexture != null) { blankTexture.Dispose(); blankTexture = null; } }; } return blankTexture; } /// /// Generates a that has a texture with a given color and outline color /// /// The sprite batch /// The fill color of the texture /// The outline color of the texture /// A containing a 3x3 texture with an outline public static NinePatch GenerateTexture(this SpriteBatch batch, Color color, Color? outlineColor = null) { var outli = outlineColor ?? Color.Black; var tex = new Texture2D(batch.GraphicsDevice, 3, 3); tex.SetData(new[] { outli, outli, outli, outli, color, outli, outli, outli, outli }); batch.Disposing += (sender, args) => { if (tex != null) { tex.Dispose(); tex = null; } }; return new NinePatch(tex, 1); } /// public static void Draw(this SpriteBatch batch, Texture2D texture, RectangleF destinationRectangle, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, SpriteEffects effects, float layerDepth) { var source = sourceRectangle ?? new Rectangle(0, 0, texture.Width, texture.Height); var scale = new Vector2(1F / source.Width, 1F / source.Height) * destinationRectangle.Size; batch.Draw(texture, destinationRectangle.Location, sourceRectangle, color, rotation, origin, scale, effects, layerDepth); } /// public static void Draw(this SpriteBatch batch, Texture2D texture, RectangleF destinationRectangle, Rectangle? sourceRectangle, Color color) { batch.Draw(texture, destinationRectangle, sourceRectangle, color, 0, Vector2.Zero, SpriteEffects.None, 0); } /// public static void Draw(this SpriteBatch batch, Texture2D texture, RectangleF destinationRectangle, Color color) { batch.Draw(texture, destinationRectangle, null, color); } } }