From bd16583fa129819e4d749e0b38edc635b6578c7a Mon Sep 17 00:00:00 2001 From: Paddy Xu Date: Sun, 31 May 2020 18:14:55 +0300 Subject: [PATCH] Fix #401: use the native image provider to render static GIFs --- .../AnimatedImage/Providers/GifProvider.cs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/GifProvider.cs b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/GifProvider.cs index 5826554..46463bb 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/GifProvider.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.ImageViewer/AnimatedImage/Providers/GifProvider.cs @@ -31,9 +31,16 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers private Bitmap _fileHandle; private BitmapSource _frame; private bool _isPlaying; + private NativeProvider _nativeProvider; public GifProvider(string path, MetaProvider meta) : base(path, meta) { + if (!ImageAnimator.CanAnimate(Image.FromFile(path))) + { + _nativeProvider = new NativeProvider(path, meta); + return; + } + _fileHandle = (Bitmap) Image.FromFile(path); _fileHandle.SetResolution(DpiHelper.DefaultDpi * DpiHelper.GetCurrentScaleFactor().Horizontal, @@ -47,11 +54,11 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers public override void Dispose() { - if (_fileHandle == null) - return; + _nativeProvider?.Dispose(); + _nativeProvider = null; ImageAnimator.StopAnimate(_fileHandle, OnFrameChanged); - _fileHandle.Dispose(); + _fileHandle?.Dispose(); _fileHandle = null; _frame = null; @@ -59,6 +66,9 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers public override Task GetThumbnail(Size renderSize) { + if (_nativeProvider != null) + return _nativeProvider.GetThumbnail(renderSize); + return new Task(() => { _frame = _fileHandle.ToBitmapSource(); @@ -68,6 +78,9 @@ namespace QuickLook.Plugin.ImageViewer.AnimatedImage.Providers public override Task GetRenderedFrame(int index) { + if (_nativeProvider != null) + return _nativeProvider.GetRenderedFrame(index); + return new Task(() => { if (!_isPlaying)