增加padding和margin参数

This commit is contained in:
ww-rm
2025-04-17 00:09:04 +08:00
parent a9f59a4d2f
commit c9c909cdf9
2 changed files with 40 additions and 34 deletions

View File

@@ -31,7 +31,7 @@ namespace SpineViewer.Extensions
/// <summary>
/// 获取适合指定画布参数下能够覆盖包围盒的视区包围盒
/// </summary>
public static RectangleF GetResolutionBounds(this RectangleF bounds, Size resolution, Padding padding, Padding margin)
public static RectangleF GetResolutionBounds(this RectangleF bounds, Size resolution, Padding margin, Padding padding)
{
float sizeW = bounds.Width;
float sizeH = bounds.Height;
@@ -40,12 +40,15 @@ namespace SpineViewer.Extensions
float scale = Math.Max(Math.Abs(sizeW / innerW), Math.Abs(sizeH / innerH)); // 取两方向上较大的缩放比, 以此让画布可以覆盖内容
float scaleW = scale * Math.Sign(sizeW);
float scaleH = scale * Math.Sign(sizeH);
return new(
bounds.X - (padding.Left + margin.Left - padding.Right - margin.Right) * scaleW,
bounds.Y - (padding.Top + margin.Top - padding.Bottom - margin.Bottom) * scaleH,
(resolution.Width + margin.Horizontal) * scaleW,
(resolution.Height + margin.Vertical) * scaleH
);
innerW *= scaleW;
innerH *= scaleH;
var x = bounds.X - (innerW - sizeW) / 2 - (margin.Left + padding.Left) * scaleW;
var y = bounds.Y - (innerH - sizeH) / 2 - (margin.Top + padding.Top) * scaleH;
var w = (resolution.Width + margin.Horizontal) * scaleW;
var h = (resolution.Height + margin.Vertical) * scaleH;
return new(x, y, w, h);
}
}
}

View File

@@ -86,23 +86,6 @@ namespace SpineViewer.Spine.SpineExporter
/// </summary>
public SFML.Graphics.Color BackgroundColorPma { get; private set; } = SFML.Graphics.Color.Transparent;
/// <summary>
/// 四周填充距离, 单位为像素
/// </summary>
public Padding Padding
{
get => padding;
set
{
if (value.Left < 0) value.Left = 0;
if (value.Right < 0) value.Right = 0;
if (value.Top < 0) value.Top = 0;
if (value.Bottom < 0) value.Bottom = 0;
padding = value;
}
}
private Padding padding = new(0);
/// <summary>
/// 四周边缘距离, 单位为像素
/// </summary>
@@ -120,6 +103,23 @@ namespace SpineViewer.Spine.SpineExporter
}
private Padding margin = new(0);
/// <summary>
/// 四周填充距离, 单位为像素
/// </summary>
public Padding Padding
{
get => padding;
set
{
if (value.Left < 0) value.Left = 0;
if (value.Right < 0) value.Right = 0;
if (value.Top < 0) value.Top = 0;
if (value.Bottom < 0) value.Bottom = 0;
padding = value;
}
}
private Padding padding = new(0);
/// <summary>
/// 自动分辨率, 将会忽略预览画面的分辨率和视图, 使用模型自身的包围盒
/// </summary>
@@ -135,7 +135,7 @@ namespace SpineViewer.Spine.SpineExporter
var w = View.Size.X;
var h = View.Size.Y;
var currentBounds = new RectangleF(x, y, w, h);
var bounds = currentBounds.GetResolutionBounds(Resolution, new(0), Margin);
var bounds = currentBounds.GetResolutionBounds(Resolution, Margin, Padding);
using var view = new SFML.Graphics.View(View);
view.Center = new(bounds.X + bounds.Width / 2, bounds.Y + bounds.Height / 2);
@@ -247,8 +247,11 @@ namespace SpineViewer.Spine.SpineExporter
boundsCache.Clear();
var spinesToRender = spines.Where(sp => !RenderSelectedOnly || sp.IsSelected).Reverse().ToArray();
if (IsExportSingle) ExportSingle(spinesToRender, worker);
else ExportIndividual(spinesToRender, worker);
if (spinesToRender.Length > 0)
{
if (IsExportSingle) ExportSingle(spinesToRender, worker);
else ExportIndividual(spinesToRender, worker);
}
logger.LogCurrentProcessMemoryUsage();
}
@@ -302,18 +305,18 @@ namespace SpineViewer.Spine.SpineExporter
[Category("[0] "), DisplayName(""), Description("使, #RRGGBBAA")]
public SFML.Graphics.Color BackgroundColor { get => Exporter.BackgroundColor; set => Exporter.BackgroundColor = value; }
/// <summary>
/// 四周填充距离
/// </summary>
[TypeConverter(typeof(PaddingConverter))]
[Category("[0] "), DisplayName(""), Description(" (Padding), , ")]
public Padding Padding { get => Exporter.Padding; set => Exporter.Padding = value; }
/// <summary>
/// 四周边缘距离
/// </summary>
[TypeConverter(typeof(PaddingConverter))]
[Category("[0] "), DisplayName(""), Description(" (Margin), ")]
public Padding Margin { get => Exporter.Margin; set => Exporter.Margin = value; }
/// <summary>
/// 四周填充距离
/// </summary>
[TypeConverter(typeof(PaddingConverter))]
[Category("[0] "), DisplayName(""), Description(" (Padding), , ")]
public Padding Padding { get => Exporter.Padding; set => Exporter.Padding = value; }
}
}