diff --git a/SpineViewer/Extensions/SFMLExtension.cs b/SpineViewer/Extensions/SFMLExtension.cs index 2c28e05..dcfb9ce 100644 --- a/SpineViewer/Extensions/SFMLExtension.cs +++ b/SpineViewer/Extensions/SFMLExtension.cs @@ -31,7 +31,7 @@ namespace SpineViewer.Extensions /// /// 获取适合指定画布参数下能够覆盖包围盒的视区包围盒 /// - 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); } } } diff --git a/SpineViewer/Spine/SpineExporter/Exporter.cs b/SpineViewer/Spine/SpineExporter/Exporter.cs index cee487d..fc8d672 100644 --- a/SpineViewer/Spine/SpineExporter/Exporter.cs +++ b/SpineViewer/Spine/SpineExporter/Exporter.cs @@ -86,23 +86,6 @@ namespace SpineViewer.Spine.SpineExporter /// public SFML.Graphics.Color BackgroundColorPma { get; private set; } = SFML.Graphics.Color.Transparent; - /// - /// 四周填充距离, 单位为像素 - /// - 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); - /// /// 四周边缘距离, 单位为像素 /// @@ -120,6 +103,23 @@ namespace SpineViewer.Spine.SpineExporter } private Padding margin = new(0); + /// + /// 四周填充距离, 单位为像素 + /// + 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); + /// /// 自动分辨率, 将会忽略预览画面的分辨率和视图, 使用模型自身的包围盒 /// @@ -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; } - /// - /// 四周填充距离 - /// - [TypeConverter(typeof(PaddingConverter))] - [Category("[0] 导出"), DisplayName("四周填充距离"), Description("画布内部的填充距离 (Padding), 导出的分辨率大小不会发生变化, 但是会留有四周空间")] - public Padding Padding { get => Exporter.Padding; set => Exporter.Padding = value; } - /// /// 四周边缘距离 /// [TypeConverter(typeof(PaddingConverter))] [Category("[0] 导出"), DisplayName("四周边缘距离"), Description("画布外部的边缘距离 (Margin), 最终导出的分辨率需要加上这个边距")] public Padding Margin { get => Exporter.Margin; set => Exporter.Margin = value; } + + /// + /// 四周填充距离 + /// + [TypeConverter(typeof(PaddingConverter))] + [Category("[0] 导出"), DisplayName("四周填充距离"), Description("画布内部的填充距离 (Padding), 导出的分辨率大小不会发生变化, 但是会留有四周空间")] + public Padding Padding { get => Exporter.Padding; set => Exporter.Padding = value; } } }