using System.Collections.Generic; using System.Collections.Immutable; using System.IO; using System.Linq; using Penumbra.Api.Enums; namespace LightlessSync.Services.TextureCompression; internal static class TextureCompressionCapabilities { private static readonly ImmutableDictionary TexTargets = new Dictionary { [TextureCompressionTarget.BC7] = TextureType.Bc7Tex, [TextureCompressionTarget.BC3] = TextureType.Bc3Tex, }.ToImmutableDictionary(); private static readonly ImmutableDictionary DdsTargets = new Dictionary { [TextureCompressionTarget.BC7] = TextureType.Bc7Dds, [TextureCompressionTarget.BC3] = TextureType.Bc3Dds, }.ToImmutableDictionary(); private static readonly TextureCompressionTarget[] SelectableTargetsCache = TexTargets .Select(kvp => kvp.Key) .OrderBy(t => t) .ToArray(); private static readonly HashSet SelectableTargetSet = SelectableTargetsCache.ToHashSet(); public static IReadOnlyList SelectableTargets => SelectableTargetsCache; public static TextureCompressionTarget DefaultTarget => TextureCompressionTarget.BC7; public static bool IsSelectable(TextureCompressionTarget target) => SelectableTargetSet.Contains(target); public static TextureCompressionTarget Normalize(TextureCompressionTarget? desired) { if (desired.HasValue && IsSelectable(desired.Value)) { return desired.Value; } return DefaultTarget; } public static bool TryGetPenumbraTarget(TextureCompressionTarget target, string? outputPath, out TextureType textureType) { if (!string.IsNullOrWhiteSpace(outputPath) && string.Equals(Path.GetExtension(outputPath), ".dds", StringComparison.OrdinalIgnoreCase)) { return DdsTargets.TryGetValue(target, out textureType); } return TexTargets.TryGetValue(target, out textureType); } }