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);
}