Files

21 lines
946 B
C#
Raw Permalink Normal View History

2026-10-07 10:23:09 +02:00
using System.Globalization;
namespace PrivaPub.Domain.Media
{
// A focal point as Mastodon's API takes it ("x,y", each within -1..1): finite numbers only, clamped to the frame. A NaN
// once stored here made every status, timeline and Note holding the post fail to serialise, for every viewer.
public static class FocalPoint
{
public static float[] Parse(string value)
{
if (value?.Split(',') is not [var x, var y]
|| !float.TryParse(x, NumberStyles.Float, CultureInfo.InvariantCulture, out var fx) || !float.IsFinite(fx)
|| !float.TryParse(y, NumberStyles.Float, CultureInfo.InvariantCulture, out var fy) || !float.IsFinite(fy))
return default;
return [Math.Clamp(fx, -1, 1), Math.Clamp(fy, -1, 1)];
}
/// <summary>Whether a stored focal point can be written out: two finite numbers.</summary>
public static bool IsSound(float[] focus) => focus is [var x, var y] && float.IsFinite(x) && float.IsFinite(y);
}
}