1
0
Fork 0
mirror of https://github.com/Ellpeck/MLEM.git synced 2024-11-22 12:58:33 +01:00

Allow specifying percentage-based padding for a NinePatch

This commit is contained in:
Ell 2022-11-03 18:16:59 +01:00
parent 2df9d6a3a8
commit cc749103e0
4 changed files with 28 additions and 17 deletions

View file

@ -24,6 +24,7 @@ Improvements
- Multi-target net452, making MLEM compatible with MonoGame for consoles - Multi-target net452, making MLEM compatible with MonoGame for consoles
- Allow retrieving the cost of a calculated path when using AStar - Allow retrieving the cost of a calculated path when using AStar
- Added trimming and AOT annotations and made MLEM trimmable - Added trimming and AOT annotations and made MLEM trimmable
- Allow specifying percentage-based padding for a NinePatch
- **Drastically improved StaticSpriteBatch batching performance** - **Drastically improved StaticSpriteBatch batching performance**
- **Made GenericFont and TokenizedString support UTF-32 characters like emoji** - **Made GenericFont and TokenizedString support UTF-32 characters like emoji**

View file

@ -91,8 +91,8 @@ namespace Demos {
TextScale = 0.1F, TextScale = 0.1F,
PanelTexture = new NinePatch(new TextureRegion(tex, 0, 8, 24, 24), 8), PanelTexture = new NinePatch(new TextureRegion(tex, 0, 8, 24, 24), 8),
ButtonTexture = new NinePatch(new TextureRegion(tex, 24, 8, 16, 16), 4), 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), ScrollBarBackground = new NinePatch(new TextureRegion(tex, 12, 0, 4, 8), 0.25F, paddingPercent: true),
ScrollBarScrollerTexture = new NinePatch(new TextureRegion(tex, 8, 0, 4, 8), 1, 1, 2, 2), ScrollBarScrollerTexture = new NinePatch(new TextureRegion(tex, 8, 0, 4, 8), 0.25F, paddingPercent: true),
LinkColor = Color.CornflowerBlue LinkColor = Color.CornflowerBlue
}; };
} }

View file

@ -95,6 +95,13 @@ namespace MLEM.Misc {
return new Padding(p.Left * scale, p.Right * scale, p.Top * scale, p.Bottom * scale); return new Padding(p.Left * scale, p.Right * scale, p.Top * scale, p.Bottom * scale);
} }
/// <summary>
/// Scales a padding by a <see cref="Vector2"/>.
/// </summary>
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);
}
/// <summary> /// <summary>
/// Adds two paddings together in a memberwise fashion. /// Adds two paddings together in a memberwise fashion.
/// </summary> /// </summary>

View file

@ -17,7 +17,7 @@ namespace MLEM.Textures {
/// </summary> /// </summary>
public readonly TextureRegion Region; public readonly TextureRegion Region;
/// <summary> /// <summary>
/// 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
/// </summary> /// </summary>
public readonly Padding Padding; public readonly Padding Padding;
/// <summary> /// <summary>
@ -33,11 +33,12 @@ namespace MLEM.Textures {
/// Creates a new nine patch from a texture and a padding /// Creates a new nine patch from a texture and a padding
/// </summary> /// </summary>
/// <param name="texture">The texture to use</param> /// <param name="texture">The texture to use</param>
/// <param name="padding">The padding that marks where the outline area stops</param> /// <param name="padding">The padding that marks where the outline area stops in pixels, or as a percentage if <paramref name="paddingPercent"/> is <see langword="true"/></param>
/// <param name="mode">The mode to use for drawing this nine patch, defaults to <see cref="NinePatchMode.Stretch"/></param> /// <param name="mode">The mode to use for drawing this nine patch, defaults to <see cref="NinePatchMode.Stretch"/></param>
public NinePatch(TextureRegion texture, Padding padding, NinePatchMode mode = NinePatchMode.Stretch) { /// <param name="paddingPercent">Whether the padding should represent a percentage of the underlying <paramref name="texture"/>'s size, rather than an absolute pixel amount</param>
public NinePatch(TextureRegion texture, Padding padding, NinePatchMode mode = NinePatchMode.Stretch, bool paddingPercent = false) {
this.Region = texture; this.Region = texture;
this.Padding = padding; this.Padding = paddingPercent ? padding * texture.Size.ToVector2() : padding;
this.Mode = mode; this.Mode = mode;
this.SourceRectangles = new Rectangle[9]; this.SourceRectangles = new Rectangle[9];
for (var i = 0; i < this.SourceRectangles.Length; i++) 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 /// Creates a new nine patch from a texture and a padding
/// </summary> /// </summary>
/// <param name="texture">The texture to use</param> /// <param name="texture">The texture to use</param>
/// <param name="paddingLeft">The padding on the left edge</param> /// <param name="paddingLeft">The padding on the left edge in pixels, or as a percentage if <paramref name="paddingPercent"/> is <see langword="true"/></param>
/// <param name="paddingRight">The padding on the right edge</param> /// <param name="paddingRight">The padding on the right edge in pixels, or as a percentage if <paramref name="paddingPercent"/> is <see langword="true"/></param>
/// <param name="paddingTop">The padding on the top edge</param> /// <param name="paddingTop">The padding on the top edge in pixels, or as a percentage if <paramref name="paddingPercent"/> is <see langword="true"/></param>
/// <param name="paddingBottom">The padding on the bottom edge</param> /// <param name="paddingBottom">The padding on the bottom edge in pixels, or as a percentage if <paramref name="paddingPercent"/> is <see langword="true"/></param>
/// <param name="mode">The mode to use for drawing this nine patch, defaults to <see cref="NinePatchMode.Stretch"/></param> /// <param name="mode">The mode to use for drawing this nine patch, defaults to <see cref="NinePatchMode.Stretch"/></param>
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) {} /// <param name="paddingPercent">Whether the padding should represent a percentage of the underlying <paramref name="texture"/>'s size, rather than an absolute pixel amount</param>
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) {}
/// <inheritdoc cref="NinePatch(TextureRegion, int, int, int, int, NinePatchMode)"/> /// <inheritdoc cref="NinePatch(TextureRegion, float, float, float, float, NinePatchMode, bool)"/>
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) {}
/// <summary> /// <summary>
/// Creates a new nine patch from a texture and a uniform padding /// Creates a new nine patch from a texture and a uniform padding
/// </summary> /// </summary>
/// <param name="texture">The texture to use</param> /// <param name="texture">The texture to use</param>
/// <param name="padding">The padding that each edge should have</param> /// <param name="padding">The padding that each edge should have in pixels, or as a percentage if <paramref name="paddingPercent"/> is <see langword="true"/></param>
/// <param name="mode">The mode to use for drawing this nine patch, defaults to <see cref="NinePatchMode.Stretch"/></param> /// <param name="mode">The mode to use for drawing this nine patch, defaults to <see cref="NinePatchMode.Stretch"/></param>
public NinePatch(Texture2D texture, int padding, NinePatchMode mode = NinePatchMode.Stretch) : this(new TextureRegion(texture), padding, mode) {} /// <param name="paddingPercent">Whether the padding should represent a percentage of the underlying <paramref name="texture"/>'s size, rather than an absolute pixel amount</param>
public NinePatch(Texture2D texture, float padding, NinePatchMode mode = NinePatchMode.Stretch, bool paddingPercent = false) : this(new TextureRegion(texture), padding, mode, paddingPercent) {}
/// <inheritdoc cref="NinePatch(TextureRegion, int, NinePatchMode)"/> /// <inheritdoc cref="NinePatch(TextureRegion, float, NinePatchMode, bool)"/>
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) { internal RectangleF GetRectangleForIndex(RectangleF area, int index, float patchScale = 1) {
var pl = this.Padding.Left * patchScale; var pl = this.Padding.Left * patchScale;