XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
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);}}
    }
}