Refactor how icons work, and made java icons work a little better
This commit is contained in:
@ -6,55 +6,27 @@ using System.Drawing;
|
||||
using System.Runtime.InteropServices;
|
||||
using FocusVolumeControl.UI;
|
||||
using BitFaster.Caching.Lru;
|
||||
using FocusVolumeControl.AudioSession;
|
||||
|
||||
namespace FocusVolumeControl.AudioSessions;
|
||||
|
||||
public sealed class ActiveAudioSessionWrapper : IAudioSession
|
||||
{
|
||||
static ConcurrentLru<string, string> _iconCache = new ConcurrentLru<string, string>(10);
|
||||
|
||||
public string DisplayName { get; set; }
|
||||
public string ExecutablePath { get; set; }
|
||||
public string IconPath { get; set; }
|
||||
private List<IAudioSessionControl2> Sessions { get; } = new List<IAudioSessionControl2>();
|
||||
private IEnumerable<ISimpleAudioVolume> Volume => Sessions.Cast<ISimpleAudioVolume>();
|
||||
|
||||
string GetIconFromIconPath()
|
||||
{
|
||||
return _iconCache.GetOrAdd(IconPath, (key) =>
|
||||
{
|
||||
var tmp = (Bitmap)Bitmap.FromFile(IconPath);
|
||||
tmp.MakeTransparent();
|
||||
return Tools.ImageToBase64(tmp, true);
|
||||
});
|
||||
}
|
||||
|
||||
string GetIconFromExecutablePath()
|
||||
{
|
||||
return _iconCache.GetOrAdd(ExecutablePath, (key) =>
|
||||
{
|
||||
var tmp = IconExtraction.GetIcon(ExecutablePath);
|
||||
//var tmp = Icon.ExtractAssociatedIcon(ExecutablePath);
|
||||
return Tools.ImageToBase64(tmp, true);
|
||||
});
|
||||
}
|
||||
public IconWrapper? IconWrapper { get; set; }
|
||||
|
||||
public string GetIcon()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(IconPath))
|
||||
{
|
||||
return GetIconFromIconPath();
|
||||
}
|
||||
else
|
||||
{
|
||||
return GetIconFromExecutablePath();
|
||||
}
|
||||
return IconWrapper?.GetIconData() ?? IconWrapper.FallbackIconData;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return "Images/encoderIcon";
|
||||
return IconWrapper.FallbackIconData;
|
||||
}
|
||||
}
|
||||
|
||||
|
107
src/FocusVolumeControl/AudioSessions/IconWrapper.cs
Normal file
107
src/FocusVolumeControl/AudioSessions/IconWrapper.cs
Normal file
@ -0,0 +1,107 @@
|
||||
using BarRaider.SdTools;
|
||||
using BitFaster.Caching.Lru;
|
||||
using FocusVolumeControl.UI;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FocusVolumeControl.AudioSession
|
||||
{
|
||||
public abstract class IconWrapper
|
||||
{
|
||||
protected static ConcurrentLru<string, string> _iconCache = new ConcurrentLru<string, string>(10);
|
||||
|
||||
public abstract string GetIconData();
|
||||
|
||||
internal const string FallbackIconData = "Images/encoderIcon";
|
||||
}
|
||||
|
||||
internal class AppxIcon : IconWrapper
|
||||
{
|
||||
private readonly string _iconPath;
|
||||
|
||||
public AppxIcon(string iconPath)
|
||||
{
|
||||
_iconPath = iconPath;
|
||||
}
|
||||
|
||||
public override string GetIconData()
|
||||
{
|
||||
if(string.IsNullOrEmpty(_iconPath))
|
||||
{
|
||||
return FallbackIconData;
|
||||
}
|
||||
|
||||
return _iconCache.GetOrAdd(_iconPath, (key) =>
|
||||
{
|
||||
var tmp = (Bitmap)Bitmap.FromFile(_iconPath);
|
||||
tmp.MakeTransparent();
|
||||
return Tools.ImageToBase64(tmp, true);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
internal class NormalIcon : IconWrapper
|
||||
{
|
||||
private readonly string _iconPath;
|
||||
|
||||
public NormalIcon(string iconPath)
|
||||
{
|
||||
_iconPath = iconPath;
|
||||
}
|
||||
|
||||
public override string GetIconData()
|
||||
{
|
||||
if(string.IsNullOrEmpty(_iconPath))
|
||||
{
|
||||
return FallbackIconData;
|
||||
}
|
||||
|
||||
return _iconCache.GetOrAdd(_iconPath, (key) =>
|
||||
{
|
||||
var tmp = IconExtraction.GetIcon(_iconPath);
|
||||
return Tools.ImageToBase64(tmp, true);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
internal class RawIcon : IconWrapper
|
||||
{
|
||||
private readonly string _data;
|
||||
|
||||
public RawIcon(string name, Lazy<Bitmap?> lazyIcon)
|
||||
{
|
||||
_data = _iconCache.GetOrAdd(name, (key) =>
|
||||
{
|
||||
var icon = lazyIcon.Value;
|
||||
if (icon == null)
|
||||
{
|
||||
return FallbackIconData;
|
||||
}
|
||||
if (icon.Height < 48 && icon.Width < 48)
|
||||
{
|
||||
using var newImage = new Bitmap(48, 48);
|
||||
newImage.MakeTransparent();
|
||||
using var graphics = Graphics.FromImage(newImage);
|
||||
|
||||
graphics.DrawImage(icon, 4, 4, 40, 40);
|
||||
|
||||
|
||||
return Tools.ImageToBase64(newImage, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
return Tools.ImageToBase64(icon, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public override string GetIconData() => _data;
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user