增加SetViewport
This commit is contained in:
@@ -8,6 +8,39 @@ namespace SpineViewer.Extensions
|
|||||||
{
|
{
|
||||||
public static class SFMLExtension
|
public static class SFMLExtension
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取适合指定画布参数下能够覆盖包围盒的画布视区包围盒
|
||||||
|
/// </summary>
|
||||||
|
public static RectangleF GetCanvasBounds(this RectangleF bounds, Size resolution) => GetCanvasBounds(bounds, resolution, new(0), new(0));
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取适合指定画布参数下能够覆盖包围盒的画布视区包围盒
|
||||||
|
/// </summary>
|
||||||
|
public static RectangleF GetCanvasBounds(this RectangleF bounds, Size resolution, Padding margin) => GetCanvasBounds(bounds, resolution, margin, new(0));
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取适合指定画布参数下能够覆盖包围盒的画布视区包围盒
|
||||||
|
/// </summary>
|
||||||
|
public static RectangleF GetCanvasBounds(this RectangleF bounds, Size resolution, Padding margin, Padding padding)
|
||||||
|
{
|
||||||
|
float sizeW = bounds.Width;
|
||||||
|
float sizeH = bounds.Height;
|
||||||
|
float innerW = resolution.Width - padding.Horizontal;
|
||||||
|
float innerH = resolution.Height - padding.Vertical;
|
||||||
|
float scale = Math.Max(Math.Abs(sizeW / innerW), Math.Abs(sizeH / innerH)); // 取两方向上较大的缩放比, 以此让画布可以覆盖内容
|
||||||
|
float scaleW = scale * Math.Sign(sizeW);
|
||||||
|
float scaleH = scale * Math.Sign(sizeH);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取 Winforms Bitmap 对象, 需要使用 Dispose 释放对象
|
/// 获取 Winforms Bitmap 对象, 需要使用 Dispose 释放对象
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -29,26 +62,33 @@ namespace SpineViewer.Extensions
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取适合指定画布参数下能够覆盖包围盒的视区包围盒
|
/// 获取视图的包围盒
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static RectangleF GetResolutionBounds(this RectangleF bounds, Size resolution, Padding margin, Padding padding)
|
public static RectangleF GetBounds(this SFML.Graphics.View view)
|
||||||
|
=> new(view.Center.X - view.Size.X / 2, view.Center.Y - view.Size.Y / 2, view.Size.X, view.Size.Y);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 按画布设置视区, 边缘和填充区域将不会出现内容
|
||||||
|
/// </summary>
|
||||||
|
public static void SetViewport(this SFML.Graphics.View view, Size resolution, Padding margin, Padding padding)
|
||||||
{
|
{
|
||||||
float sizeW = bounds.Width;
|
var innerW = resolution.Width - padding.Horizontal;
|
||||||
float sizeH = bounds.Height;
|
var innerH = resolution.Height - padding.Vertical;
|
||||||
float innerW = resolution.Width - padding.Horizontal;
|
|
||||||
float innerH = resolution.Height - padding.Vertical;
|
|
||||||
float scale = Math.Max(Math.Abs(sizeW / innerW), Math.Abs(sizeH / innerH)); // 取两方向上较大的缩放比, 以此让画布可以覆盖内容
|
|
||||||
float scaleW = scale * Math.Sign(sizeW);
|
|
||||||
float scaleH = scale * Math.Sign(sizeH);
|
|
||||||
|
|
||||||
innerW *= scaleW;
|
float width = resolution.Width + margin.Horizontal;
|
||||||
innerH *= scaleH;
|
float height = resolution.Height + margin.Vertical;
|
||||||
|
|
||||||
var x = bounds.X - (innerW - sizeW) / 2 - (margin.Left + padding.Left) * scaleW;
|
view.Viewport = new(
|
||||||
var y = bounds.Y - (innerH - sizeH) / 2 - (margin.Top + padding.Top) * scaleH;
|
(margin.Left + padding.Left) / width,
|
||||||
var w = (resolution.Width + margin.Horizontal) * scaleW;
|
(margin.Top + padding.Top) / height,
|
||||||
var h = (resolution.Height + margin.Vertical) * scaleH;
|
innerW / width,
|
||||||
return new(x, y, w, h);
|
innerH / height
|
||||||
|
);
|
||||||
|
|
||||||
|
var bounds = view.GetBounds().GetCanvasBounds(new(innerW, innerH));
|
||||||
|
|
||||||
|
view.Center = new(bounds.X + bounds.Width / 2, bounds.Y + bounds.Height / 2);
|
||||||
|
view.Size = new(bounds.Width, bounds.Height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user