Refactored image creation APIs to use byte[] for logo data instead of System.Drawing.Image, enabling cross-platform support. Wrapped all GDI+/Windows-specific code in #if WINDOWS and updated project files to conditionally include Windows-only dependencies. Defaulted to ImageSharp on non-Windows, and updated UI and settings to reflect platform capabilities. Application now builds and runs on Linux/macOS with Avalonia and ImageSharp, while retaining full Windows functionality.
54 lines
2.1 KiB
C#
54 lines
2.1 KiB
C#
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.
|
|
/// On non-Windows platforms only ImageCreatorImageSharp is available.
|
|
/// </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;
|
|
}
|
|
|
|
public Task CreateImageAsync(ImageState imgState, byte[]? logoData)
|
|
{
|
|
var provider = (_settings.ImageCreatorProvider ?? "Sharp").Trim();
|
|
_logger?.LogDebug("Resolving IImageCreator for provider '{Provider}'", provider);
|
|
|
|
#if WINDOWS
|
|
return provider.Equals("ALTERNATE", StringComparison.OrdinalIgnoreCase)
|
|
? 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
|
|
}
|
|
|
|
private Task ResolveAndCall<T>(ImageState imgState, byte[]? logoData) where T : IImageCreator
|
|
{
|
|
var impl = (IImageCreator?)_sp.GetService(typeof(T));
|
|
if (impl is null)
|
|
{
|
|
_logger?.LogWarning("Requested image creator {Type} is not registered. Falling back to ImageCreatorImageSharp.", typeof(T).Name);
|
|
impl = (IImageCreator?)_sp.GetService(typeof(ImageCreatorImageSharp));
|
|
}
|
|
|
|
if (impl is null)
|
|
throw new InvalidOperationException("No IImageCreator implementation is registered.");
|
|
|
|
return impl.CreateImageAsync(imgState, logoData);
|
|
}
|
|
}
|