From 3950bba9cfc4381a5285a0b88c193f647a1fa95f Mon Sep 17 00:00:00 2001 From: Julia Taylor-Hell Date: Tue, 6 Dec 2022 12:58:58 -0800 Subject: [PATCH 1/3] Using the same list of file extensions as Lightbox's AppxManifest, and ensuring we convert file extension to lowercase --- .../Previewers/PreviewerFactory.cs | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/modules/peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs b/src/modules/peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs index 3fe0ee0aec9..bf30819eb4b 100644 --- a/src/modules/peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs +++ b/src/modules/peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs @@ -11,8 +11,9 @@ public class PreviewerFactory public IPreviewer? Create(File file) { // TODO: investigate performance of reflection to resolve previewer type - switch (file.Extension) + switch (file.Extension.ToLower()) { + // Image types case ".bmp": case ".gif": case ".jpg": @@ -24,6 +25,53 @@ public class PreviewerFactory case ".png": case ".tif": case ".tiff": + case ".dib": + case ".heic": + case ".heif": + case ".hif": + case ".avif": + case ".jxr": + case ".wdp": + case ".ico": + case ".thumb": + + // Raw types + case ".arw": + case ".cr2": + case ".crw": + case ".erf": + case ".kdc": + case ".mrw": + case ".nef": + case ".nrw": + case ".orf": + case ".pef": + case ".raf": + case ".raw": + case ".rw2": + case ".rwl": + case ".sr2": + case ".srw": + case ".srf": + case ".dcs": + case ".dcr": + case ".drf": + case ".k25": + case ".3fr": + case ".ari": + case ".bay": + case ".cap": + case ".iiq": + case ".eip": + case ".fff": + case ".mef": + case ".mdc": + case ".mos": + case ".R3D": + case ".rwz": + case ".x3f": + case ".ori": + case ".cr3": return new ImagePreviewer(file); default: return null; From cbd46069c14b361b14754ecc209c6ac5e4e31339 Mon Sep 17 00:00:00 2001 From: Julia Taylor-Hell Date: Tue, 6 Dec 2022 14:51:53 -0800 Subject: [PATCH 2/3] Add IsFileTypeSupported to IPreviewer --- .../Previewers/IPreviewer.cs | 3 + .../ImagePreviewer/ImagePreviewer.cs | 71 +++++++++++++++++++ .../Previewers/PreviewerFactory.cs | 69 ++---------------- 3 files changed, 79 insertions(+), 64 deletions(-) diff --git a/src/modules/peek/Peek.FilePreviewer/Previewers/IPreviewer.cs b/src/modules/peek/Peek.FilePreviewer/Previewers/IPreviewer.cs index 70ec9a019fc..4313b59a2bc 100644 --- a/src/modules/peek/Peek.FilePreviewer/Previewers/IPreviewer.cs +++ b/src/modules/peek/Peek.FilePreviewer/Previewers/IPreviewer.cs @@ -4,6 +4,7 @@ namespace Peek.FilePreviewer.Previewers { + using System; using System.ComponentModel; using System.Threading.Tasks; using Windows.Foundation; @@ -12,6 +13,8 @@ public interface IPreviewer : INotifyPropertyChanged { bool IsPreviewLoaded { get; } + public static bool IsFileTypeSupported(string fileExt) => throw new NotImplementedException(); + public Task GetPreviewSizeAsync(); Task LoadPreviewAsync(); diff --git a/src/modules/peek/Peek.FilePreviewer/Previewers/ImagePreviewer/ImagePreviewer.cs b/src/modules/peek/Peek.FilePreviewer/Previewers/ImagePreviewer/ImagePreviewer.cs index 3565511cdc8..4d60a259cfa 100644 --- a/src/modules/peek/Peek.FilePreviewer/Previewers/ImagePreviewer/ImagePreviewer.cs +++ b/src/modules/peek/Peek.FilePreviewer/Previewers/ImagePreviewer/ImagePreviewer.cs @@ -7,6 +7,7 @@ namespace Peek.FilePreviewer.Previewers using System; using System.Drawing.Imaging; using System.IO; + using System.Linq; using System.Threading; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; @@ -168,5 +169,75 @@ private static async Task GetBitmapFromHBitmapAsync(IntPtr hbitmap NativeMethods.DeleteObject(hbitmap); } } + + public static bool IsFileTypeSupported(string fileExt) + { + return _supportedFileTypes.Contains(fileExt.ToLower()); + } + + private static readonly string[] _supportedFileTypes = new string[] + { + // Image types + ".bmp", + ".gif", + ".jpg", + ".jfif", + ".jfi", + ".jif", + ".jpeg", + ".jpe", + ".png", + ".tif", + ".tiff", + ".dib", + + // ".heic", // Error in System.Drawing.Image.FromHbitmap(hbitmap); + ".heif", + ".hif", + ".avif", + ".jxr", + ".wdp", + ".ico", + ".thumb", + + // Raw types + ".arw", + ".cr2", + + // ".crw", // Error in WICImageFactory.CreateDecoderFromFilename + // ".erf", // Error in WICImageFactory.CreateDecoderFromFilename + ".kdc", + ".mrw", + ".nef", + ".nrw", + ".orf", + ".pef", + ".raf", + ".raw", + ".rw2", + ".rwl", + ".sr2", + ".srw", + ".srf", + ".dcs", + ".dcr", + ".drf", + ".k25", + ".3fr", + ".ari", + ".bay", + ".cap", + ".iiq", + ".eip", + ".fff", + ".mef", + ".mdc", + ".mos", + ".R3D", + ".rwz", + ".x3f", + ".ori", + ".cr3", + }; } } diff --git a/src/modules/peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs b/src/modules/peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs index bf30819eb4b..e7bdebd5ed6 100644 --- a/src/modules/peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs +++ b/src/modules/peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs @@ -10,72 +10,13 @@ public class PreviewerFactory { public IPreviewer? Create(File file) { - // TODO: investigate performance of reflection to resolve previewer type - switch (file.Extension.ToLower()) + if (ImagePreviewer.IsFileTypeSupported(file.Extension.ToLower())) { - // Image types - case ".bmp": - case ".gif": - case ".jpg": - case ".jfif": - case ".jfi": - case ".jif": - case ".jpeg": - case ".jpe": - case ".png": - case ".tif": - case ".tiff": - case ".dib": - case ".heic": - case ".heif": - case ".hif": - case ".avif": - case ".jxr": - case ".wdp": - case ".ico": - case ".thumb": - - // Raw types - case ".arw": - case ".cr2": - case ".crw": - case ".erf": - case ".kdc": - case ".mrw": - case ".nef": - case ".nrw": - case ".orf": - case ".pef": - case ".raf": - case ".raw": - case ".rw2": - case ".rwl": - case ".sr2": - case ".srw": - case ".srf": - case ".dcs": - case ".dcr": - case ".drf": - case ".k25": - case ".3fr": - case ".ari": - case ".bay": - case ".cap": - case ".iiq": - case ".eip": - case ".fff": - case ".mef": - case ".mdc": - case ".mos": - case ".R3D": - case ".rwz": - case ".x3f": - case ".ori": - case ".cr3": - return new ImagePreviewer(file); - default: - return null; + return new ImagePreviewer(file); } + + // Other previewer types check their supported file types here + return null; } } } From daf0cb6820b8657cb6ba1db0731ccf6e2a4eec8d Mon Sep 17 00:00:00 2001 From: Julia Taylor-Hell Date: Tue, 6 Dec 2022 16:55:51 -0800 Subject: [PATCH 3/3] respond to PR comments --- src/modules/peek/Peek.Common/Models/File.cs | 2 +- .../Previewers/ImagePreviewer/ImagePreviewer.cs | 6 +++--- .../peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/modules/peek/Peek.Common/Models/File.cs b/src/modules/peek/Peek.Common/Models/File.cs index 58ab722a057..0e527321a88 100644 --- a/src/modules/peek/Peek.Common/Models/File.cs +++ b/src/modules/peek/Peek.Common/Models/File.cs @@ -21,7 +21,7 @@ public File(string path) public string Path { get; init; } - public string Extension => System.IO.Path.GetExtension(Path); + public string Extension => System.IO.Path.GetExtension(Path).ToLower(); public async Task GetStorageFileAsync() { diff --git a/src/modules/peek/Peek.FilePreviewer/Previewers/ImagePreviewer/ImagePreviewer.cs b/src/modules/peek/Peek.FilePreviewer/Previewers/ImagePreviewer/ImagePreviewer.cs index 4d60a259cfa..32833034607 100644 --- a/src/modules/peek/Peek.FilePreviewer/Previewers/ImagePreviewer/ImagePreviewer.cs +++ b/src/modules/peek/Peek.FilePreviewer/Previewers/ImagePreviewer/ImagePreviewer.cs @@ -5,9 +5,9 @@ namespace Peek.FilePreviewer.Previewers { using System; + using System.Collections.Generic; using System.Drawing.Imaging; using System.IO; - using System.Linq; using System.Threading; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; @@ -172,10 +172,10 @@ private static async Task GetBitmapFromHBitmapAsync(IntPtr hbitmap public static bool IsFileTypeSupported(string fileExt) { - return _supportedFileTypes.Contains(fileExt.ToLower()); + return _supportedFileTypes.Contains(fileExt); } - private static readonly string[] _supportedFileTypes = new string[] + private static readonly HashSet _supportedFileTypes = new HashSet { // Image types ".bmp", diff --git a/src/modules/peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs b/src/modules/peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs index e7bdebd5ed6..7508951eba7 100644 --- a/src/modules/peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs +++ b/src/modules/peek/Peek.FilePreviewer/Previewers/PreviewerFactory.cs @@ -10,7 +10,7 @@ public class PreviewerFactory { public IPreviewer? Create(File file) { - if (ImagePreviewer.IsFileTypeSupported(file.Extension.ToLower())) + if (ImagePreviewer.IsFileTypeSupported(file.Extension)) { return new ImagePreviewer(file); }