From 058534ba671d10488c21c464869789cf46af68b5 Mon Sep 17 00:00:00 2001 From: ww-rm Date: Sat, 5 Apr 2025 01:14:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E6=B3=84=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SpineViewer/Controls/SpinePreviewer.cs | 39 ++++++++++++++++++-------- SpineViewer/Exporter/ExportArgs.cs | 7 ++++- SpineViewer/Spine/Spine.cs | 6 ++-- 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/SpineViewer/Controls/SpinePreviewer.cs b/SpineViewer/Controls/SpinePreviewer.cs index 9b134a0..0205aa9 100644 --- a/SpineViewer/Controls/SpinePreviewer.cs +++ b/SpineViewer/Controls/SpinePreviewer.cs @@ -120,7 +120,7 @@ namespace SpineViewer.Controls RenderWindow.Size = new((uint)sizeX, (uint)sizeY); // 将 view 的大小设置成于 resolution 相同的大小, 其余属性都不变 - var view = RenderWindow.GetView(); + using var view = RenderWindow.GetView(); var signX = Math.Sign(view.Size.X); var signY = Math.Sign(view.Size.Y); view.Size = new(value.Width * signX, value.Height * signY); @@ -140,12 +140,13 @@ namespace SpineViewer.Controls { get { - var center = RenderWindow.GetView().Center; + using var view = RenderWindow.GetView(); + var center = view.Center; return new(center.X, center.Y); } set { - var view = RenderWindow.GetView(); + using var view = RenderWindow.GetView(); view.Center = new(value.X, value.Y); RenderWindow.SetView(view); } @@ -158,11 +159,15 @@ namespace SpineViewer.Controls [Browsable(false)] public float Zoom { - get => resolution.Width / Math.Abs(RenderWindow.GetView().Size.X); + get + { + using var view = RenderWindow.GetView(); + return resolution.Width / Math.Abs(view.Size.X); + } set { value = Math.Clamp(value, ZOOM_MIN, ZOOM_MAX); - var view = RenderWindow.GetView(); + using var view = RenderWindow.GetView(); var signX = Math.Sign(view.Size.X); var signY = Math.Sign(view.Size.Y); view.Size = new(resolution.Width / value * signX, resolution.Height / value * signY); @@ -177,10 +182,14 @@ namespace SpineViewer.Controls [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public float Rotation { - get => RenderWindow.GetView().Rotation; + get + { + using var view = RenderWindow.GetView(); + return view.Rotation; + } set { - var view = RenderWindow.GetView(); + using var view = RenderWindow.GetView(); view.Rotation = value; RenderWindow.SetView(view); } @@ -193,10 +202,14 @@ namespace SpineViewer.Controls [Browsable(false)] public bool FlipX { - get => RenderWindow.GetView().Size.X < 0; + get + { + using var view = RenderWindow.GetView(); + return view.Size.X < 0; + } set { - var view = RenderWindow.GetView(); + using var view = RenderWindow.GetView(); var size = view.Size; if (size.X > 0 && value || size.X < 0 && !value) size.X *= -1; @@ -212,10 +225,14 @@ namespace SpineViewer.Controls [Browsable(false)] public bool FlipY { - get => RenderWindow.GetView().Size.Y < 0; + get + { + using var view = RenderWindow.GetView(); + return view.Size.Y < 0; + } set { - var view = RenderWindow.GetView(); + using var view = RenderWindow.GetView(); var size = view.Size; if (size.Y > 0 && value || size.Y < 0 && !value) size.Y *= -1; diff --git a/SpineViewer/Exporter/ExportArgs.cs b/SpineViewer/Exporter/ExportArgs.cs index 6abfa1f..21f203f 100644 --- a/SpineViewer/Exporter/ExportArgs.cs +++ b/SpineViewer/Exporter/ExportArgs.cs @@ -8,13 +8,14 @@ using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; namespace SpineViewer.Exporter { /// /// 导出参数基类 /// - public abstract class ExportArgs : ImplementationResolver + public abstract class ExportArgs : ImplementationResolver, IDisposable { /// /// 创建指定类型导出参数 @@ -34,6 +35,10 @@ namespace SpineViewer.Exporter RenderSelectedOnly = renderSelectedOnly; } + ~ExportArgs() { Dispose(false); } + public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } + protected virtual void Dispose(bool disposing) { View?.Dispose(); } + /// /// 输出文件夹 /// diff --git a/SpineViewer/Spine/Spine.cs b/SpineViewer/Spine/Spine.cs index db1c531..b2eee34 100644 --- a/SpineViewer/Spine/Spine.cs +++ b/SpineViewer/Spine/Spine.cs @@ -81,14 +81,14 @@ namespace SpineViewer.Spine // 除此之外, 似乎还和 tex 的 Dispose 有关 // 如果不对 tex 进行 Dispose, 那么不管是否 Draw 都正常不会死锁 var tex = new SFML.Graphics.RenderTexture(PREVIEW_WIDTH, PREVIEW_HEIGHT); - tex.SetView(bounds.GetView(PREVIEW_WIDTH, PREVIEW_HEIGHT)); + using var view = bounds.GetView(PREVIEW_WIDTH, PREVIEW_HEIGHT); + tex.SetView(view); tex.Clear(SFML.Graphics.Color.Transparent); tex.Draw(this); tex.Display(); Preview = tex.Texture.CopyToBitmap(); // 取最后一个作为初始, 尽可能去显示非默认的内容 - //skin = SkinNames.Last(); setAnimation(0, AnimationNames.Last()); return this; @@ -320,7 +320,7 @@ namespace SpineViewer.Spine private void reloadSkins() { clearSkin(); - foreach (var s in loadedSkins) addSkin(s); + foreach (var s in loadedSkins.Distinct()) addSkin(s); update(0); }