fix: rebuild ranges

This commit is contained in:
Anna 2022-06-01 17:28:32 -04:00
parent 41f91b4661
commit 231407befb

View File

@ -41,8 +41,8 @@ internal sealed class PluginUi : IDisposable {
private (GCHandle, int, float) _jpFont; private (GCHandle, int, float) _jpFont;
private (GCHandle, int) _gameSymFont; private (GCHandle, int) _gameSymFont;
private readonly ImVector _ranges; private ImVector _ranges;
private readonly ImVector _jpRange; private ImVector _jpRange;
private GCHandle _symRange = GCHandle.Alloc( private GCHandle _symRange = GCHandle.Alloc(
new ushort[] { new ushort[] {
@ -74,56 +74,7 @@ internal sealed class PluginUi : IDisposable {
MergeMode = true, MergeMode = true,
}; };
void BuildRange(out ImVector result, IReadOnlyList<ushort>? chars, params IntPtr[] ranges) { this.SetUpRanges();
var builder = new ImFontGlyphRangesBuilderPtr(ImGuiNative.ImFontGlyphRangesBuilder_ImFontGlyphRangesBuilder());
// text
foreach (var range in ranges) {
builder.AddRanges(range);
}
// chars
if (chars != null) {
for (var i = 0; i < chars.Count; i += 2) {
if (chars[i] == 0) {
break;
}
for (var j = (uint) chars[i]; j <= chars[i + 1]; j++) {
builder.AddChar((ushort) j);
}
}
}
// various symbols
builder.AddText("←→↑↓《》■※☀★★☆♥♡ヅツッシ☀☁☂℃℉°♀♂♠♣♦♣♧®©™€$£♯♭♪✓√◎◆◇♦■□〇●△▽▼▲‹›≤≥<«“”─\~");
// French
builder.AddText("Œœ");
// Romanian
builder.AddText("ĂăÂâÎîȘșȚț");
// "Enclosed Alphanumerics" (partial) https://www.compart.com/en/unicode/block/U+2460
for (var i = 0x2460; i <= 0x24B5; i++) {
builder.AddChar((char) i);
}
builder.AddChar('⓪');
builder.BuildRanges(out result);
builder.Destroy();
}
var ranges = new List<IntPtr> {
ImGui.GetIO().Fonts.GetGlyphRangesDefault(),
};
foreach (var extraRange in Enum.GetValues<ExtraGlyphRanges>()) {
if (this.Plugin.Config.ExtraGlyphRanges.HasFlag(extraRange)) {
ranges.Add(extraRange.Range());
}
}
BuildRange(out this._ranges, null, ranges.ToArray());
BuildRange(out this._jpRange, GlyphRangesJapanese.GlyphRanges);
this.SetUpUserFonts(); this.SetUpUserFonts();
var gameSym = new HttpClient().GetAsync("https://img.finalfantasyxiv.com/lds/pc/global/fonts/FFXIV_Lodestone_SSF.ttf") var gameSym = new HttpClient().GetAsync("https://img.finalfantasyxiv.com/lds/pc/global/fonts/FFXIV_Lodestone_SSF.ttf")
@ -212,6 +163,62 @@ internal sealed class PluginUi : IDisposable {
return memory.ToArray(); return memory.ToArray();
} }
private unsafe void SetUpRanges() {
ImVector BuildRange(IReadOnlyList<ushort>? chars, params IntPtr[] ranges) {
var builder = new ImFontGlyphRangesBuilderPtr(ImGuiNative.ImFontGlyphRangesBuilder_ImFontGlyphRangesBuilder());
// text
foreach (var range in ranges) {
builder.AddRanges(range);
}
// chars
if (chars != null) {
for (var i = 0; i < chars.Count; i += 2) {
if (chars[i] == 0) {
break;
}
for (var j = (uint) chars[i]; j <= chars[i + 1]; j++) {
builder.AddChar((ushort) j);
}
}
}
// various symbols
builder.AddText("←→↑↓《》■※☀★★☆♥♡ヅツッシ☀☁☂℃℉°♀♂♠♣♦♣♧®©™€$£♯♭♪✓√◎◆◇♦■□〇●△▽▼▲‹›≤≥<«“”─\~");
// French
builder.AddText("Œœ");
// Romanian
builder.AddText("ĂăÂâÎîȘșȚț");
// "Enclosed Alphanumerics" (partial) https://www.compart.com/en/unicode/block/U+2460
for (var i = 0x2460; i <= 0x24B5; i++) {
builder.AddChar((char) i);
}
builder.AddChar('⓪');
var result = new ImVector();
builder.BuildRanges(out result);
builder.Destroy();
return result;
}
var ranges = new List<IntPtr> {
ImGui.GetIO().Fonts.GetGlyphRangesDefault(),
};
foreach (var extraRange in Enum.GetValues<ExtraGlyphRanges>()) {
if (this.Plugin.Config.ExtraGlyphRanges.HasFlag(extraRange)) {
ranges.Add(extraRange.Range());
}
}
this._ranges = BuildRange(null, ranges.ToArray());
this._jpRange = BuildRange(GlyphRangesJapanese.GlyphRanges);
}
private void SetUpUserFonts() { private void SetUpUserFonts() {
FontData? fontData = null; FontData? fontData = null;
if (this.Plugin.Config.GlobalFont.StartsWith(Fonts.IncludedIndicator)) { if (this.Plugin.Config.GlobalFont.StartsWith(Fonts.IncludedIndicator)) {
@ -294,6 +301,7 @@ internal sealed class PluginUi : IDisposable {
this.RegularFont = null; this.RegularFont = null;
this.ItalicFont = null; this.ItalicFont = null;
this.SetUpRanges();
this.SetUpUserFonts(); this.SetUpUserFonts();
this.Axis = this.Plugin.Interface.UiBuilder.GetGameFontHandle(new GameFontStyle(GameFontFamily.Axis, this.Plugin.Config.FontSize)); this.Axis = this.Plugin.Interface.UiBuilder.GetGameFontHandle(new GameFontStyle(GameFontFamily.Axis, this.Plugin.Config.FontSize));