using System.Runtime.InteropServices.WindowsRuntime;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Media.Imaging;
using XFEEDToolBox.Core.Rendering;
using XFEEDToolBox.Rendering;
namespace XFEEDToolBox.Controls;
public sealed class ModuleIcon:UserControl
{
public static readonly DependencyProperty ItemProperty=DependencyProperty.Register(nameof(Item),typeof(string),typeof(ModuleIcon),new PropertyMetadata("",Changed));
public string Item{get=>(string)GetValue(ItemProperty);set=>SetValue(ItemProperty,value);}
public string ResourceHash{get;private set;}="";
public string Failure{get;private set;}="";
public bool IsRealGameIcon=>ResourceHash.Length==40&&image.Source is not null;
private readonly Image image=new(){Stretch=Stretch.Uniform};
private int version;
public ModuleIcon(){Content=image;IsHitTestVisible=false;Loaded+=(_,_)=>Update();Unloaded+=(_,_)=>version++;}
private static void Changed(DependencyObject sender,DependencyPropertyChangedEventArgs args)=>((ModuleIcon)sender).Update();
private async void Update()
{
var request=++version;image.Source=null;ResourceHash=Failure="";
var name=EliteModuleIcons.IconName(Item);
if(!IsLoaded||name.Length==0)return;
try
{
var pixels=await LocalShipModels.LoadIconAsync(name);
if(request!=version||!IsLoaded)return;
var bitmap=new WriteableBitmap(pixels.Width,pixels.Height);
using(var stream=bitmap.PixelBuffer.AsStream())
{
var bgra=new byte[pixels.Rgba.Length];
for(var i=0;i<bgra.Length;i+=4)
{
var alpha=pixels.Rgba[i+3];bgra[i]=(byte)(pixels.Rgba[i+2]*alpha/255);bgra[i+1]=(byte)(pixels.Rgba[i+1]*alpha/255);bgra[i+2]=(byte)(pixels.Rgba[i]*alpha/255);bgra[i+3]=alpha;
}
stream.Write(bgra);
}
bitmap.Invalidate();image.Source=bitmap;ResourceHash=pixels.ResourceHash;
}
catch(Exception error){if(request==version){Failure=error.Message;App.Runtime.Log("模块图标",error.Message);}}
}
}
using System.Runtime.InteropServices.WindowsRuntime;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Media.Imaging;
using XFEEDToolBox.Core.Rendering;
using XFEEDToolBox.Rendering;
namespace XFEEDToolBox.Controls;
public sealed class ModuleIcon:UserControl
{
public static readonly DependencyProperty ItemProperty=DependencyProperty.Register(nameof(Item),typeof(string),typeof(ModuleIcon),new PropertyMetadata("",Changed));
public string Item{get=>(string)GetValue(ItemProperty);set=>SetValue(ItemProperty,value);}
public string ResourceHash{get;private set;}="";
public string Failure{get;private set;}="";
public bool IsRealGameIcon=>ResourceHash.Length==40&&image.Source is not null;
private readonly Image image=new(){Stretch=Stretch.Uniform};
private int version;
public ModuleIcon(){Content=image;IsHitTestVisible=false;Loaded+=(_,_)=>Update();Unloaded+=(_,_)=>version++;}
private static void Changed(DependencyObject sender,DependencyPropertyChangedEventArgs args)=>((ModuleIcon)sender).Update();
private async void Update()
{
var request=++version;image.Source=null;ResourceHash=Failure="";
var name=EliteModuleIcons.IconName(Item);
if(!IsLoaded||name.Length==0)return;
try
{
var pixels=await LocalShipModels.LoadIconAsync(name);
if(request!=version||!IsLoaded)return;
var bitmap=new WriteableBitmap(pixels.Width,pixels.Height);
using(var stream=bitmap.PixelBuffer.AsStream())
{
var bgra=new byte[pixels.Rgba.Length];
for(var i=0;i<bgra.Length;i+=4)
{
var alpha=pixels.Rgba[i+3];bgra[i]=(byte)(pixels.Rgba[i+2]*alpha/255);bgra[i+1]=(byte)(pixels.Rgba[i+1]*alpha/255);bgra[i+2]=(byte)(pixels.Rgba[i]*alpha/255);bgra[i+3]=alpha;
}
stream.Write(bgra);
}
bitmap.Invalidate();image.Source=bitmap;ResourceHash=pixels.ResourceHash;
}
catch(Exception error){if(request==version){Failure=error.Message;App.Runtime.Log("模块图标",error.Message);}}
}
}