diff --git a/src/UniGetUI.Avalonia/Models/PackageCollections.cs b/src/UniGetUI.Avalonia/Models/PackageCollections.cs index 125c99342..597d48a8f 100644 --- a/src/UniGetUI.Avalonia/Models/PackageCollections.cs +++ b/src/UniGetUI.Avalonia/Models/PackageCollections.cs @@ -201,6 +201,13 @@ private async Task LoadIconAsync() if (uri.IsFile) { + if (!IsSkiaDecodableExtension(uri.LocalPath)) + { + // Avalonia's Bitmap (Skia) can't decode SVG/AVIF/ICO/TIFF — the + // icon cache may produce those. Reject upfront so we don't throw. + _iconCache[hash] = null; + return; + } bitmap = await Task.Run(() => new Bitmap(uri.LocalPath)).ConfigureAwait(false); } else if (uri.Scheme is "http" or "https") @@ -223,6 +230,17 @@ private async Task LoadIconAsync() catch { _iconCache[hash] = null; } } + private static bool IsSkiaDecodableExtension(string path) + { + string ext = Path.GetExtension(path); + return ext.Equals(".png", StringComparison.OrdinalIgnoreCase) + || ext.Equals(".jpg", StringComparison.OrdinalIgnoreCase) + || ext.Equals(".jpeg", StringComparison.OrdinalIgnoreCase) + || ext.Equals(".gif", StringComparison.OrdinalIgnoreCase) + || ext.Equals(".bmp", StringComparison.OrdinalIgnoreCase) + || ext.Equals(".webp", StringComparison.OrdinalIgnoreCase); + } + private void Package_PropertyChanged(object? sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(Package.Tag)) diff --git a/src/UniGetUI.PackageEngine.PackageEngine/UniGetUI.PackageEngine.PEInterface.csproj b/src/UniGetUI.PackageEngine.PackageEngine/UniGetUI.PackageEngine.PEInterface.csproj index ccfcb2527..c614e9d7d 100644 --- a/src/UniGetUI.PackageEngine.PackageEngine/UniGetUI.PackageEngine.PEInterface.csproj +++ b/src/UniGetUI.PackageEngine.PackageEngine/UniGetUI.PackageEngine.PEInterface.csproj @@ -24,20 +24,49 @@ - - - - - + + + + false + + + false + + + false + + + false + - - - - - - - + + + + false + + + false + + + false + + + false + + + false + + + false + @@ -47,4 +76,4 @@ - + \ No newline at end of file