using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RhythmBullet.Utilities.DataTypes { public class NinePatch { public Color color; readonly Texture2D texture; readonly int a, b, c, d; private Rectangle sourceRectangle; private Rectangle drawnRectangle; /// /// A nine patch object. /// /// Texture used for the nine patch. Dimensions must be greater than their sum border counter parts. /// Left side. /// Right side. /// Bottom side. /// Top side. public NinePatch(Texture2D texture, int a, int b, int c, int d) { this.texture = texture; if (a + b >= texture.Width) throw new ArgumentOutOfRangeException("a and b cannot be greater than or equal to the width of texture."); if (c + d >= texture.Height) throw new ArgumentOutOfRangeException("c and d cannot be greater or equal to the height of the texture."); this.a = a; this.b = b; this.c = c; this.d = d; color = Color.White; } public void Draw(SpriteBatch batch, Rectangle destination) { //1x1 drawnRectangle.X = destination.X; drawnRectangle.Y = destination.Y; drawnRectangle.Width = a; drawnRectangle.Height = c; sourceRectangle.X = 0; sourceRectangle.Y = 0; sourceRectangle.Width = a; sourceRectangle.Height = c; batch.Draw(texture, drawnRectangle, sourceRectangle, color); //2x1 drawnRectangle.X = destination.X + a; drawnRectangle.Y = destination.Y; drawnRectangle.Width = destination.Width - a - b; drawnRectangle.Height = c; sourceRectangle.X = a; sourceRectangle.Y = 0; sourceRectangle.Width = texture.Width - a - b; sourceRectangle.Height = c; batch.Draw(texture, drawnRectangle, sourceRectangle, color); //3x1 drawnRectangle.X = destination.X + destination.Width - b; drawnRectangle.Y = destination.Y; drawnRectangle.Width = b; drawnRectangle.Height = c; sourceRectangle.X = texture.Width - b; sourceRectangle.Y = 0; sourceRectangle.Width = b; sourceRectangle.Height = c; batch.Draw(texture, drawnRectangle, sourceRectangle, color); //1x2 drawnRectangle.X = destination.X; drawnRectangle.Y = destination.Y + c; drawnRectangle.Width = a; drawnRectangle.Height = destination.Height - d - c; sourceRectangle.X = 0; sourceRectangle.Y = c; sourceRectangle.Width = a; sourceRectangle.Height = texture.Height - c - d; batch.Draw(texture, drawnRectangle, sourceRectangle, color); //2x2 drawnRectangle.X = destination.X + a; drawnRectangle.Y = destination.Y + c; drawnRectangle.Width = destination.Width - a - b; drawnRectangle.Height = destination.Height - c - d; sourceRectangle.X = a; sourceRectangle.Y = c; sourceRectangle.Width = texture.Width - a - b; sourceRectangle.Height = texture.Height - c - d; batch.Draw(texture, drawnRectangle, sourceRectangle, color); //3x2 drawnRectangle.X = destination.X + destination.Width - b; drawnRectangle.Y = destination.Y + c; drawnRectangle.Width = b; drawnRectangle.Height = destination.Height - c - d; sourceRectangle.X = texture.Width - b; sourceRectangle.Y = c; sourceRectangle.Width = b; sourceRectangle.Height = texture.Height - c - d; batch.Draw(texture, drawnRectangle, sourceRectangle, color); //1x3 drawnRectangle.X = destination.X; drawnRectangle.Y = destination.Height - d; drawnRectangle.Width = a; drawnRectangle.Height = d; sourceRectangle.X = a; sourceRectangle.Y = texture.Height - d; sourceRectangle.Width = a; sourceRectangle.Height = d; batch.Draw(texture, drawnRectangle, sourceRectangle, color); //2x3 drawnRectangle.X = destination.X + a; drawnRectangle.Y = destination.Height - d; drawnRectangle.Width = destination.Width - a - b; drawnRectangle.Height = d; sourceRectangle.X = a; sourceRectangle.Y = texture.Height - d; sourceRectangle.Width = texture.Width - a - b; sourceRectangle.Height = d; batch.Draw(texture, drawnRectangle, sourceRectangle, color); //3x3 drawnRectangle.X = destination.X + destination.Width - b; drawnRectangle.Y = destination.Height - d; drawnRectangle.Width = b; drawnRectangle.Height = d; sourceRectangle.X = texture.Width - b; sourceRectangle.Y = texture.Height - d; sourceRectangle.Width = b; sourceRectangle.Height = d; batch.Draw(texture, drawnRectangle, sourceRectangle, color); } } }