Add IFontHandle.Lock and WaitAsync

This commit is contained in:
Soreepeong 2024-01-21 03:10:41 +09:00
parent 620f3999d2
commit d70b430e0d
9 changed files with 543 additions and 86 deletions

View file

@ -1,7 +1,9 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using Dalamud.Interface.GameFonts;
using Dalamud.Interface.ManagedFontAtlas;
@ -11,6 +13,8 @@ using Dalamud.Utility;
using ImGuiNET;
using Serilog;
namespace Dalamud.Interface.Internal.Windows.Data.Widgets;
/// <summary>
@ -103,6 +107,10 @@ internal class GamePrebakedFontsTestWidget : IDataWindowWidget, IDisposable
minCapacity: 1024);
}
ImGui.SameLine();
if (ImGui.Button("Test Lock"))
Task.Run(this.TestLock);
fixed (byte* labelPtr = "Test Input"u8)
{
if (ImGuiNative.igInputTextMultiline(
@ -210,4 +218,49 @@ internal class GamePrebakedFontsTestWidget : IDataWindowWidget, IDisposable
this.privateAtlas?.Dispose();
this.privateAtlas = null;
}
private async void TestLock()
{
if (this.fontHandles is not { } fontHandlesCopy)
return;
Log.Information($"{nameof(GamePrebakedFontsTestWidget)}: {nameof(this.TestLock)} waiting for build");
await using var garbage = new DisposeSafety.ScopedFinalizer();
var fonts = new List<ImFontPtr>();
IFontHandle[] handles;
try
{
handles = fontHandlesCopy.Values.SelectMany(x => x).Select(x => x.Handle.Value).ToArray();
foreach (var handle in handles)
{
await handle.WaitAsync();
var locked = handle.Lock();
garbage.Add(locked);
fonts.Add(locked);
}
}
catch (ObjectDisposedException)
{
Log.Information($"{nameof(GamePrebakedFontsTestWidget)}: {nameof(this.TestLock)} cancelled");
return;
}
Log.Information($"{nameof(GamePrebakedFontsTestWidget)}: {nameof(this.TestLock)} waiting in lock");
await Task.Delay(5000);
foreach (var (font, handle) in fonts.Zip(handles))
TestSingle(font, handle);
return;
unsafe void TestSingle(ImFontPtr fontPtr, IFontHandle handle)
{
var dim = default(Vector2);
var test = "Test string"u8;
fixed (byte* pTest = test)
ImGuiNative.ImFont_CalcTextSizeA(&dim, fontPtr, fontPtr.FontSize, float.MaxValue, 0, pTest, null, null);
Log.Information($"{nameof(GamePrebakedFontsTestWidget)}: {handle} => {dim}");
}
}
}