mirror of
https://github.com/goatcorp/Dalamud.git
synced 2026-02-25 06:01:49 +01:00
Merge 44c0b7ebdd into 7d2f12c6e2
This commit is contained in:
commit
a7ba8e8e48
4 changed files with 63 additions and 3 deletions
|
|
@ -58,7 +58,7 @@ internal sealed partial class TextureManager
|
||||||
/// <param name="textureWrap">The texture.</param>
|
/// <param name="textureWrap">The texture.</param>
|
||||||
/// <param name="ownerPlugin">The plugin.</param>
|
/// <param name="ownerPlugin">The plugin.</param>
|
||||||
/// <returns>Same <paramref name="textureWrap"/>.</returns>
|
/// <returns>Same <paramref name="textureWrap"/>.</returns>
|
||||||
public unsafe IDalamudTextureWrap Blame(IDalamudTextureWrap textureWrap, LocalPlugin? ownerPlugin)
|
public unsafe IDalamudTextureWrap Blame(IDalamudTextureWrap? textureWrap, LocalPlugin? ownerPlugin)
|
||||||
{
|
{
|
||||||
if (!this.dalamudConfiguration.UseTexturePluginTracking)
|
if (!this.dalamudConfiguration.UseTexturePluginTracking)
|
||||||
return textureWrap;
|
return textureWrap;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
|
using System.Drawing;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
|
@ -17,13 +19,21 @@ using Dalamud.Plugin.Services;
|
||||||
using Dalamud.Storage.Assets;
|
using Dalamud.Storage.Assets;
|
||||||
using Dalamud.Utility;
|
using Dalamud.Utility;
|
||||||
using Dalamud.Utility.TerraFxCom;
|
using Dalamud.Utility.TerraFxCom;
|
||||||
|
|
||||||
using Lumina.Data;
|
using Lumina.Data;
|
||||||
using Lumina.Data.Files;
|
using Lumina.Data.Files;
|
||||||
|
|
||||||
using TerraFX.Interop.DirectX;
|
using TerraFX.Interop.DirectX;
|
||||||
using TerraFX.Interop.Windows;
|
using TerraFX.Interop.Windows;
|
||||||
|
|
||||||
|
using static TerraFX.Interop.Windows.COINIT;
|
||||||
|
using static TerraFX.Interop.Windows.SIIGBF;
|
||||||
|
using static TerraFX.Interop.Windows.Windows;
|
||||||
|
|
||||||
|
using BitmapData = System.Drawing.Imaging.BitmapData;
|
||||||
|
using HBITMAP = TerraFX.Interop.Windows.HBITMAP;
|
||||||
|
using ImageLockMode = System.Drawing.Imaging.ImageLockMode;
|
||||||
|
using IShellItemImageFactory = TerraFX.Interop.Windows.IShellItemImageFactory;
|
||||||
|
using SIZE = TerraFX.Interop.Windows.SIZE;
|
||||||
|
|
||||||
namespace Dalamud.Interface.Textures.Internal;
|
namespace Dalamud.Interface.Textures.Internal;
|
||||||
|
|
||||||
/// <summary>Service responsible for loading and disposing ImGui texture wraps.</summary>
|
/// <summary>Service responsible for loading and disposing ImGui texture wraps.</summary>
|
||||||
|
|
@ -303,6 +313,42 @@ internal sealed partial class TextureManager
|
||||||
return (supported & required) == required;
|
return (supported & required) == required;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public unsafe IDalamudTextureWrap? TryGetFileThumbnail(string path)
|
||||||
|
{
|
||||||
|
const int size = 256;
|
||||||
|
HRESULT hr = CoInitializeEx(null, (uint)(COINIT_DISABLE_OLE1DDE | COINIT_MULTITHREADED));
|
||||||
|
if (hr.FAILED)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
IShellItemImageFactory* imageFact;
|
||||||
|
fixed (char* pstr = path)
|
||||||
|
{
|
||||||
|
hr = SHCreateItemFromParsingName(pstr, null, __uuidof<IShellItemImageFactory>(), (void**)&imageFact);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hr.FAILED)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
HBITMAP hbmp;
|
||||||
|
imageFact->GetImage(new SIZE(cx: size, cy: size), (int)SIIGBF_BIGGERSIZEOK, &hbmp);
|
||||||
|
var image = Image.FromHbitmap(hbmp);
|
||||||
|
BitmapData bd = image.LockBits(new(Point.Empty, image.Size), ImageLockMode.ReadOnly, image.PixelFormat);
|
||||||
|
var rowSize = bd.Stride < 0 ? -bd.Stride : bd.Stride;
|
||||||
|
var pixels = new byte[bd.Height * rowSize];
|
||||||
|
var iptr = bd.Scan0;
|
||||||
|
|
||||||
|
for (int y = 0; y < bd.Height; y++)
|
||||||
|
{
|
||||||
|
Marshal.Copy(IntPtr.Add(iptr, y * bd.Stride),
|
||||||
|
pixels, y * rowSize,
|
||||||
|
rowSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
image.UnlockBits(bd);
|
||||||
|
return this.CreateFromRaw(new RawImageSpecification(bd.Width, bd.Height, (int)DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_UNORM), pixels.AsSpan());
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="ITextureProvider.CreateFromRaw"/>
|
/// <inheritdoc cref="ITextureProvider.CreateFromRaw"/>
|
||||||
internal unsafe IDalamudTextureWrap NoThrottleCreateFromRaw(
|
internal unsafe IDalamudTextureWrap NoThrottleCreateFromRaw(
|
||||||
RawImageSpecification specs,
|
RawImageSpecification specs,
|
||||||
|
|
|
||||||
|
|
@ -454,6 +454,15 @@ internal sealed class TextureManagerPluginScoped
|
||||||
await manager.CopyToClipboardAsync(wrap, preferredFileNameWithoutExtension, leaveWrapOpen, cancellationToken);
|
await manager.CopyToClipboardAsync(wrap, preferredFileNameWithoutExtension, leaveWrapOpen, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public IDalamudTextureWrap? TryGetFileThumbnail(string path)
|
||||||
|
{
|
||||||
|
var manager = this.ManagerOrThrow;
|
||||||
|
var textureWrap = manager.TryGetFileThumbnail(path);
|
||||||
|
manager.Blame(textureWrap, this.plugin);
|
||||||
|
return textureWrap;
|
||||||
|
}
|
||||||
|
|
||||||
private void ResultOnInterceptTexDataLoad(string path, ref string? replacementPath) =>
|
private void ResultOnInterceptTexDataLoad(string path, ref string? replacementPath) =>
|
||||||
this.InterceptTexDataLoad?.Invoke(path, ref replacementPath);
|
this.InterceptTexDataLoad?.Invoke(path, ref replacementPath);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -330,4 +330,9 @@ public interface ITextureProvider : IDalamudService
|
||||||
/// <c>((delegate* unmanaged<nint, void>)(*(nint**)ptr)[3](ptr)</c>.</para>
|
/// <c>((delegate* unmanaged<nint, void>)(*(nint**)ptr)[3](ptr)</c>.</para>
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
nint ConvertToKernelTexture(IDalamudTextureWrap wrap, bool leaveWrapOpen = false);
|
nint ConvertToKernelTexture(IDalamudTextureWrap wrap, bool leaveWrapOpen = false);
|
||||||
|
|
||||||
|
/// <summary>Tries to get a files thumbnail from the Win32 API</summary>
|
||||||
|
/// <param name="filePath">Path to file you want to preview.</param>
|
||||||
|
/// <returns>A <see cref="IDalamudTextureWrap"/> TextureWrap or null.</returns>
|
||||||
|
IDalamudTextureWrap? TryGetFileThumbnail(string filePath);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue