2026-02-15 00:14:04 +01:00
|
|
|
using System;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
|
|
|
|
|
namespace MaddoShared;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Dynamically resolves the concrete IImageCreator implementation at call time
|
|
|
|
|
/// based on current PicSettings.ImageCreatorProvider.
|
2026-02-26 19:17:23 +01:00
|
|
|
/// On non-Windows platforms only ImageCreatorImageSharp is available.
|
2026-02-15 00:14:04 +01:00
|
|
|
/// </summary>
|
|
|
|
|
public class ImageCreatorMapper : IImageCreator
|
|
|
|
|
{
|
|
|
|
|
private readonly IServiceProvider _sp;
|
|
|
|
|
private readonly PicSettings _settings;
|
|
|
|
|
private readonly ILogger<ImageCreatorMapper> _logger;
|
|
|
|
|
|
|
|
|
|
public ImageCreatorMapper(IServiceProvider sp, PicSettings settings, ILogger<ImageCreatorMapper> logger)
|
|
|
|
|
{
|
|
|
|
|
_sp = sp ?? throw new ArgumentNullException(nameof(sp));
|
|
|
|
|
_settings = settings ?? throw new ArgumentNullException(nameof(settings));
|
|
|
|
|
_logger = logger;
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-26 19:17:23 +01:00
|
|
|
public Task CreateImageAsync(ImageState imgState, byte[]? logoData)
|
2026-02-15 00:14:04 +01:00
|
|
|
{
|
|
|
|
|
var provider = (_settings.ImageCreatorProvider ?? "Sharp").Trim();
|
|
|
|
|
_logger?.LogDebug("Resolving IImageCreator for provider '{Provider}'", provider);
|
|
|
|
|
|
2026-02-26 19:17:23 +01:00
|
|
|
#if WINDOWS
|
2026-02-15 00:14:04 +01:00
|
|
|
return provider.Equals("ALTERNATE", StringComparison.OrdinalIgnoreCase)
|
2026-02-26 19:17:23 +01:00
|
|
|
? ResolveAndCall<ImageCreatorImageSharp>(imgState, logoData)
|
|
|
|
|
: ResolveAndCall<ImageCreatorGDI>(imgState, logoData);
|
|
|
|
|
#else
|
|
|
|
|
// GDI is not available on non-Windows — always use ImageSharp
|
|
|
|
|
return ResolveAndCall<ImageCreatorImageSharp>(imgState, logoData);
|
|
|
|
|
#endif
|
2026-02-15 00:14:04 +01:00
|
|
|
}
|
|
|
|
|
|
2026-02-26 19:17:23 +01:00
|
|
|
private Task ResolveAndCall<T>(ImageState imgState, byte[]? logoData) where T : IImageCreator
|
2026-02-15 00:14:04 +01:00
|
|
|
{
|
2026-02-26 19:17:23 +01:00
|
|
|
var impl = (IImageCreator?)_sp.GetService(typeof(T));
|
2026-02-15 00:14:04 +01:00
|
|
|
if (impl is null)
|
|
|
|
|
{
|
2026-02-26 19:17:23 +01:00
|
|
|
_logger?.LogWarning("Requested image creator {Type} is not registered. Falling back to ImageCreatorImageSharp.", typeof(T).Name);
|
|
|
|
|
impl = (IImageCreator?)_sp.GetService(typeof(ImageCreatorImageSharp));
|
2026-02-15 00:14:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (impl is null)
|
|
|
|
|
throw new InvalidOperationException("No IImageCreator implementation is registered.");
|
|
|
|
|
|
2026-02-26 19:17:23 +01:00
|
|
|
return impl.CreateImageAsync(imgState, logoData);
|
2026-02-15 00:14:04 +01:00
|
|
|
}
|
|
|
|
|
}
|