From cc749103e05eb05bac91142ff3e26a949f68633b Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Thu, 3 Nov 2022 18:16:59 +0100 Subject: [PATCH] Allow specifying percentage-based padding for a NinePatch --- CHANGELOG.md | 1 + Demos/GameImpl.cs | 4 ++-- MLEM/Misc/Padding.cs | 7 +++++++ MLEM/Textures/NinePatch.cs | 33 ++++++++++++++++++--------------- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5639e1..5394dd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ Improvements - Multi-target net452, making MLEM compatible with MonoGame for consoles - Allow retrieving the cost of a calculated path when using AStar - Added trimming and AOT annotations and made MLEM trimmable +- Allow specifying percentage-based padding for a NinePatch - **Drastically improved StaticSpriteBatch batching performance** - **Made GenericFont and TokenizedString support UTF-32 characters like emoji** diff --git a/Demos/GameImpl.cs b/Demos/GameImpl.cs index 5badbb6..d05a49a 100644 --- a/Demos/GameImpl.cs +++ b/Demos/GameImpl.cs @@ -91,8 +91,8 @@ namespace Demos { TextScale = 0.1F, PanelTexture = new NinePatch(new TextureRegion(tex, 0, 8, 24, 24), 8), ButtonTexture = new NinePatch(new TextureRegion(tex, 24, 8, 16, 16), 4), - ScrollBarBackground = new NinePatch(new TextureRegion(tex, 12, 0, 4, 8), 1, 1, 2, 2), - ScrollBarScrollerTexture = new NinePatch(new TextureRegion(tex, 8, 0, 4, 8), 1, 1, 2, 2), + ScrollBarBackground = new NinePatch(new TextureRegion(tex, 12, 0, 4, 8), 0.25F, paddingPercent: true), + ScrollBarScrollerTexture = new NinePatch(new TextureRegion(tex, 8, 0, 4, 8), 0.25F, paddingPercent: true), LinkColor = Color.CornflowerBlue }; } diff --git a/MLEM/Misc/Padding.cs b/MLEM/Misc/Padding.cs index 92f6aaf..adec88c 100644 --- a/MLEM/Misc/Padding.cs +++ b/MLEM/Misc/Padding.cs @@ -95,6 +95,13 @@ namespace MLEM.Misc { return new Padding(p.Left * scale, p.Right * scale, p.Top * scale, p.Bottom * scale); } + /// + /// Scales a padding by a . + /// + public static Padding operator *(Padding p, Vector2 scale) { + return new Padding(p.Left * scale.X, p.Right * scale.X, p.Top * scale.Y, p.Bottom * scale.Y); + } + /// /// Adds two paddings together in a memberwise fashion. /// diff --git a/MLEM/Textures/NinePatch.cs b/MLEM/Textures/NinePatch.cs index 4de6384..1a3481c 100644 --- a/MLEM/Textures/NinePatch.cs +++ b/MLEM/Textures/NinePatch.cs @@ -17,7 +17,7 @@ namespace MLEM.Textures { /// public readonly TextureRegion Region; /// - /// The padding in each direction that marks where the outline area stops + /// The padding in each direction that marks where the outline area stops, in pixels /// public readonly Padding Padding; /// @@ -33,11 +33,12 @@ namespace MLEM.Textures { /// Creates a new nine patch from a texture and a padding /// /// The texture to use - /// The padding that marks where the outline area stops + /// The padding that marks where the outline area stops in pixels, or as a percentage if is /// The mode to use for drawing this nine patch, defaults to - public NinePatch(TextureRegion texture, Padding padding, NinePatchMode mode = NinePatchMode.Stretch) { + /// Whether the padding should represent a percentage of the underlying 's size, rather than an absolute pixel amount + public NinePatch(TextureRegion texture, Padding padding, NinePatchMode mode = NinePatchMode.Stretch, bool paddingPercent = false) { this.Region = texture; - this.Padding = padding; + this.Padding = paddingPercent ? padding * texture.Size.ToVector2() : padding; this.Mode = mode; this.SourceRectangles = new Rectangle[9]; for (var i = 0; i < this.SourceRectangles.Length; i++) @@ -48,26 +49,28 @@ namespace MLEM.Textures { /// Creates a new nine patch from a texture and a padding /// /// The texture to use - /// The padding on the left edge - /// The padding on the right edge - /// The padding on the top edge - /// The padding on the bottom edge + /// The padding on the left edge in pixels, or as a percentage if is + /// The padding on the right edge in pixels, or as a percentage if is + /// The padding on the top edge in pixels, or as a percentage if is + /// The padding on the bottom edge in pixels, or as a percentage if is /// The mode to use for drawing this nine patch, defaults to - public NinePatch(TextureRegion texture, int paddingLeft, int paddingRight, int paddingTop, int paddingBottom, NinePatchMode mode = NinePatchMode.Stretch) : this(texture, new Padding(paddingLeft, paddingRight, paddingTop, paddingBottom), mode) {} + /// Whether the padding should represent a percentage of the underlying 's size, rather than an absolute pixel amount + public NinePatch(TextureRegion texture, float paddingLeft, float paddingRight, float paddingTop, float paddingBottom, NinePatchMode mode = NinePatchMode.Stretch, bool paddingPercent = false) : this(texture, new Padding(paddingLeft, paddingRight, paddingTop, paddingBottom), mode, paddingPercent) {} - /// - public NinePatch(Texture2D texture, int paddingLeft, int paddingRight, int paddingTop, int paddingBottom, NinePatchMode mode = NinePatchMode.Stretch) : this(new TextureRegion(texture), paddingLeft, paddingRight, paddingTop, paddingBottom, mode) {} + /// + public NinePatch(Texture2D texture, float paddingLeft, float paddingRight, float paddingTop, float paddingBottom, NinePatchMode mode = NinePatchMode.Stretch, bool paddingPercent = false) : this(new TextureRegion(texture), paddingLeft, paddingRight, paddingTop, paddingBottom, mode, paddingPercent) {} /// /// Creates a new nine patch from a texture and a uniform padding /// /// The texture to use - /// The padding that each edge should have + /// The padding that each edge should have in pixels, or as a percentage if is /// The mode to use for drawing this nine patch, defaults to - public NinePatch(Texture2D texture, int padding, NinePatchMode mode = NinePatchMode.Stretch) : this(new TextureRegion(texture), padding, mode) {} + /// Whether the padding should represent a percentage of the underlying 's size, rather than an absolute pixel amount + public NinePatch(Texture2D texture, float padding, NinePatchMode mode = NinePatchMode.Stretch, bool paddingPercent = false) : this(new TextureRegion(texture), padding, mode, paddingPercent) {} - /// - public NinePatch(TextureRegion texture, int padding, NinePatchMode mode = NinePatchMode.Stretch) : this(texture, padding, padding, padding, padding, mode) {} + /// + public NinePatch(TextureRegion texture, float padding, NinePatchMode mode = NinePatchMode.Stretch, bool paddingPercent = false) : this(texture, padding, padding, padding, padding, mode, paddingPercent) {} internal RectangleF GetRectangleForIndex(RectangleF area, int index, float patchScale = 1) { var pl = this.Padding.Left * patchScale;