2022-12-29 03:17:29 +00:00
|
|
|
|
using System;
|
2016-04-21 22:37:40 +00:00
|
|
|
|
using System.Collections.Concurrent;
|
2017-01-13 15:40:32 +00:00
|
|
|
|
using System.Collections.Generic;
|
2014-12-18 11:22:47 +00:00
|
|
|
|
using System.Linq;
|
2021-07-31 08:23:58 +00:00
|
|
|
|
using System.Threading;
|
2017-01-13 15:40:32 +00:00
|
|
|
|
using System.Windows.Media;
|
2024-01-22 18:06:14 +00:00
|
|
|
|
using FastCache;
|
|
|
|
|
|
using FastCache.Services;
|
2014-12-18 11:22:47 +00:00
|
|
|
|
|
2020-08-05 09:57:23 +00:00
|
|
|
|
namespace Flow.Launcher.Infrastructure.Image
|
2014-12-18 11:22:47 +00:00
|
|
|
|
{
|
2020-11-11 02:56:53 +00:00
|
|
|
|
public class ImageUsage
|
|
|
|
|
|
{
|
|
|
|
|
|
public int usage;
|
|
|
|
|
|
public ImageSource imageSource;
|
|
|
|
|
|
|
|
|
|
|
|
public ImageUsage(int usage, ImageSource image)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.usage = usage;
|
|
|
|
|
|
imageSource = image;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2016-04-21 00:53:21 +00:00
|
|
|
|
public class ImageCache
|
2014-12-18 11:22:47 +00:00
|
|
|
|
{
|
2024-01-22 18:06:14 +00:00
|
|
|
|
private const int MaxCached = 150;
|
2021-05-23 14:54:52 +00:00
|
|
|
|
|
2023-04-24 14:58:32 +00:00
|
|
|
|
public void Initialize(Dictionary<(string, bool), int> usage)
|
2020-11-07 16:01:33 +00:00
|
|
|
|
{
|
|
|
|
|
|
foreach (var key in usage.Keys)
|
|
|
|
|
|
{
|
2024-01-22 18:06:14 +00:00
|
|
|
|
Cached<ImageUsage>.Save(key, new ImageUsage(usage[key], null), TimeSpan.MaxValue, MaxCached);
|
2020-11-07 16:01:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-10-30 19:39:57 +00:00
|
|
|
|
public ImageSource this[string path, bool isFullImage = false]
|
2014-12-18 11:22:47 +00:00
|
|
|
|
{
|
2017-01-13 15:40:32 +00:00
|
|
|
|
get
|
2014-12-18 11:22:47 +00:00
|
|
|
|
{
|
2024-01-22 18:06:14 +00:00
|
|
|
|
if (!Cached<ImageUsage>.TryGet((path, isFullImage), out var value))
|
2020-11-07 16:01:33 +00:00
|
|
|
|
{
|
2022-10-30 19:39:57 +00:00
|
|
|
|
return null;
|
2020-11-07 16:01:33 +00:00
|
|
|
|
}
|
2020-11-15 12:45:00 +00:00
|
|
|
|
|
2024-01-22 18:06:14 +00:00
|
|
|
|
value.Value.usage++;
|
|
|
|
|
|
return value.Value.imageSource;
|
2014-12-18 11:22:47 +00:00
|
|
|
|
}
|
2020-08-05 09:30:45 +00:00
|
|
|
|
set
|
|
|
|
|
|
{
|
2024-01-22 18:06:14 +00:00
|
|
|
|
if (Cached<ImageUsage>.TryGet((path, isFullImage), out var cached))
|
2020-08-05 09:30:45 +00:00
|
|
|
|
{
|
2024-01-22 18:06:14 +00:00
|
|
|
|
cached.Value.imageSource = value;
|
|
|
|
|
|
cached.Value.usage++;
|
2020-08-05 09:30:45 +00:00
|
|
|
|
}
|
2024-01-22 18:06:14 +00:00
|
|
|
|
|
|
|
|
|
|
Cached<ImageUsage>.Save((path, isFullImage), new ImageUsage(0, value), TimeSpan.MaxValue,
|
|
|
|
|
|
MaxCached);
|
2020-08-05 09:30:45 +00:00
|
|
|
|
}
|
2016-05-22 04:30:38 +00:00
|
|
|
|
}
|
2014-12-18 11:22:47 +00:00
|
|
|
|
|
2022-10-30 19:39:57 +00:00
|
|
|
|
public bool ContainsKey(string key, bool isFullImage)
|
2017-01-13 15:40:32 +00:00
|
|
|
|
{
|
2024-01-22 18:06:14 +00:00
|
|
|
|
return Cached<ImageUsage>.TryGet((key, isFullImage), out _);
|
2014-12-18 11:22:47 +00:00
|
|
|
|
}
|
2020-01-03 19:16:17 +00:00
|
|
|
|
|
2022-12-29 03:43:40 +00:00
|
|
|
|
public bool TryGetValue(string key, bool isFullImage, out ImageSource image)
|
|
|
|
|
|
{
|
2024-01-22 18:06:14 +00:00
|
|
|
|
if (Cached<ImageUsage>.TryGet((key, isFullImage), out var value))
|
2022-12-29 03:43:40 +00:00
|
|
|
|
{
|
2024-01-22 18:06:14 +00:00
|
|
|
|
image = value.Value.imageSource;
|
|
|
|
|
|
value.Value.usage++;
|
|
|
|
|
|
return image != null;
|
2022-12-29 03:43:40 +00:00
|
|
|
|
}
|
2024-01-22 18:06:14 +00:00
|
|
|
|
|
|
|
|
|
|
image = null;
|
|
|
|
|
|
return false;
|
2022-12-29 03:43:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-01-03 19:16:17 +00:00
|
|
|
|
public int CacheSize()
|
|
|
|
|
|
{
|
2024-01-22 18:06:14 +00:00
|
|
|
|
return CacheManager.TotalCount<(string, bool), ImageUsage>();
|
2020-01-03 19:16:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// return the number of unique images in the cache (by reference not by checking images content)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public int UniqueImagesInCache()
|
|
|
|
|
|
{
|
2024-01-22 18:06:14 +00:00
|
|
|
|
return CacheManager.EnumerateEntries<(string, bool), ImageUsage>().Select(x => x.Value.imageSource)
|
|
|
|
|
|
.Distinct()
|
|
|
|
|
|
.Count();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public IEnumerable<Cached<(string, bool), ImageUsage>> EnumerateEntries()
|
|
|
|
|
|
{
|
|
|
|
|
|
return CacheManager.EnumerateEntries<(string, bool), ImageUsage>();
|
2020-01-03 19:16:17 +00:00
|
|
|
|
}
|
2014-12-18 11:22:47 +00:00
|
|
|
|
}
|
2022-10-30 19:39:57 +00:00
|
|
|
|
}
|