mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-13 12:14:16 +01:00
refactor: move CopyGlyphsAcrossFonts into ImGuiHelpers.cs
This commit is contained in:
parent
5e98011a57
commit
02d19df0f7
4 changed files with 108 additions and 102 deletions
|
|
@ -136,7 +136,7 @@ namespace Dalamud.Interface.GameFonts
|
||||||
font->Descent /= fontScale;
|
font->Descent /= fontScale;
|
||||||
if (font->ConfigData != null)
|
if (font->ConfigData != null)
|
||||||
font->ConfigData->SizePixels /= fontScale;
|
font->ConfigData->SizePixels /= fontScale;
|
||||||
var glyphs = (Util.ImFontGlyphReal*)font->Glyphs.Data;
|
var glyphs = (ImGuiHelpers.ImFontGlyphReal*)font->Glyphs.Data;
|
||||||
for (int i = 0, i_ = font->Glyphs.Size; i < i_; i++)
|
for (int i = 0, i_ = font->Glyphs.Size; i < i_; i++)
|
||||||
{
|
{
|
||||||
var glyph = &glyphs[i];
|
var glyph = &glyphs[i];
|
||||||
|
|
@ -212,7 +212,7 @@ namespace Dalamud.Interface.GameFonts
|
||||||
/// <param name="rebuildLookupTable">Whether to call target.BuildLookupTable().</param>
|
/// <param name="rebuildLookupTable">Whether to call target.BuildLookupTable().</param>
|
||||||
public void CopyGlyphsAcrossFonts(ImFontPtr? source, GameFontStyle target, bool missingOnly, bool rebuildLookupTable)
|
public void CopyGlyphsAcrossFonts(ImFontPtr? source, GameFontStyle target, bool missingOnly, bool rebuildLookupTable)
|
||||||
{
|
{
|
||||||
Util.CopyGlyphsAcrossFonts(source, this.fonts[target], missingOnly, rebuildLookupTable);
|
ImGuiHelpers.CopyGlyphsAcrossFonts(source, this.fonts[target], missingOnly, rebuildLookupTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -224,7 +224,7 @@ namespace Dalamud.Interface.GameFonts
|
||||||
/// <param name="rebuildLookupTable">Whether to call target.BuildLookupTable().</param>
|
/// <param name="rebuildLookupTable">Whether to call target.BuildLookupTable().</param>
|
||||||
public void CopyGlyphsAcrossFonts(GameFontStyle source, ImFontPtr? target, bool missingOnly, bool rebuildLookupTable)
|
public void CopyGlyphsAcrossFonts(GameFontStyle source, ImFontPtr? target, bool missingOnly, bool rebuildLookupTable)
|
||||||
{
|
{
|
||||||
Util.CopyGlyphsAcrossFonts(this.fonts[source], target, missingOnly, rebuildLookupTable);
|
ImGuiHelpers.CopyGlyphsAcrossFonts(this.fonts[source], target, missingOnly, rebuildLookupTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -236,7 +236,7 @@ namespace Dalamud.Interface.GameFonts
|
||||||
/// <param name="rebuildLookupTable">Whether to call target.BuildLookupTable().</param>
|
/// <param name="rebuildLookupTable">Whether to call target.BuildLookupTable().</param>
|
||||||
public void CopyGlyphsAcrossFonts(GameFontStyle source, GameFontStyle target, bool missingOnly, bool rebuildLookupTable)
|
public void CopyGlyphsAcrossFonts(GameFontStyle source, GameFontStyle target, bool missingOnly, bool rebuildLookupTable)
|
||||||
{
|
{
|
||||||
Util.CopyGlyphsAcrossFonts(this.fonts[source], this.fonts[target], missingOnly, rebuildLookupTable);
|
ImGuiHelpers.CopyGlyphsAcrossFonts(this.fonts[source], this.fonts[target], missingOnly, rebuildLookupTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -364,7 +364,7 @@ namespace Dalamud.Interface.GameFonts
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Util.CopyGlyphsAcrossFonts(InterfaceManager.DefaultFont, font, true, false);
|
ImGuiHelpers.CopyGlyphsAcrossFonts(InterfaceManager.DefaultFont, font, true, false);
|
||||||
UnscaleFont(font, 1 / scale, false);
|
UnscaleFont(font, 1 / scale, false);
|
||||||
font.BuildLookupTable();
|
font.BuildLookupTable();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
|
|
||||||
using ImGuiNET;
|
using ImGuiNET;
|
||||||
|
|
@ -136,6 +139,67 @@ namespace Dalamud.Interface
|
||||||
/// <param name="text">The text to write.</param>
|
/// <param name="text">The text to write.</param>
|
||||||
public static void SafeTextWrapped(string text) => ImGui.TextWrapped(text.Replace("%", "%%"));
|
public static void SafeTextWrapped(string text) => ImGui.TextWrapped(text.Replace("%", "%%"));
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fills missing glyphs in target font from source font, if both are not null.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="source">Source font.</param>
|
||||||
|
/// <param name="target">Target font.</param>
|
||||||
|
/// <param name="missingOnly">Whether to copy missing glyphs only.</param>
|
||||||
|
/// <param name="rebuildLookupTable">Whether to call target.BuildLookupTable().</param>
|
||||||
|
/// <param name="rangeLow">Low codepoint range to copy.</param>
|
||||||
|
/// <param name="rangeHigh">High codepoing range to copy.</param>
|
||||||
|
public static void CopyGlyphsAcrossFonts(ImFontPtr? source, ImFontPtr? target, bool missingOnly, bool rebuildLookupTable, int rangeLow = 32, int rangeHigh = 0xFFFE)
|
||||||
|
{
|
||||||
|
if (!source.HasValue || !target.HasValue)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var scale = target.Value!.FontSize / source.Value!.FontSize;
|
||||||
|
unsafe
|
||||||
|
{
|
||||||
|
var glyphs = (ImFontGlyphReal*)source.Value!.Glyphs.Data;
|
||||||
|
for (int j = 0, k = source.Value!.Glyphs.Size; j < k; j++)
|
||||||
|
{
|
||||||
|
Debug.Assert(glyphs != null, nameof(glyphs) + " != null");
|
||||||
|
|
||||||
|
var glyph = &glyphs[j];
|
||||||
|
if (glyph->Codepoint < rangeLow || glyph->Codepoint > rangeHigh)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var prevGlyphPtr = (ImFontGlyphReal*)target.Value!.FindGlyphNoFallback((ushort)glyph->Codepoint).NativePtr;
|
||||||
|
if ((IntPtr)prevGlyphPtr == IntPtr.Zero)
|
||||||
|
{
|
||||||
|
target.Value!.AddGlyph(
|
||||||
|
target.Value!.ConfigData,
|
||||||
|
(ushort)glyph->Codepoint,
|
||||||
|
glyph->X0 * scale,
|
||||||
|
((glyph->Y0 - source.Value!.Ascent) * scale) + target.Value!.Ascent,
|
||||||
|
glyph->X1 * scale,
|
||||||
|
((glyph->Y1 - source.Value!.Ascent) * scale) + target.Value!.Ascent,
|
||||||
|
glyph->U0,
|
||||||
|
glyph->V0,
|
||||||
|
glyph->U1,
|
||||||
|
glyph->V1,
|
||||||
|
glyph->AdvanceX * scale);
|
||||||
|
}
|
||||||
|
else if (!missingOnly)
|
||||||
|
{
|
||||||
|
prevGlyphPtr->X0 = glyph->X0 * scale;
|
||||||
|
prevGlyphPtr->Y0 = ((glyph->Y0 - source.Value!.Ascent) * scale) + target.Value!.Ascent;
|
||||||
|
prevGlyphPtr->X1 = glyph->X1 * scale;
|
||||||
|
prevGlyphPtr->Y1 = ((glyph->Y1 - source.Value!.Ascent) * scale) + target.Value!.Ascent;
|
||||||
|
prevGlyphPtr->U0 = glyph->U0;
|
||||||
|
prevGlyphPtr->V0 = glyph->V0;
|
||||||
|
prevGlyphPtr->U1 = glyph->U1;
|
||||||
|
prevGlyphPtr->V1 = glyph->V1;
|
||||||
|
prevGlyphPtr->AdvanceX = glyph->AdvanceX * scale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rebuildLookupTable)
|
||||||
|
target.Value!.BuildLookupTable();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get data needed for each new frame.
|
/// Get data needed for each new frame.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -143,5 +207,41 @@ namespace Dalamud.Interface
|
||||||
{
|
{
|
||||||
GlobalScale = ImGui.GetIO().FontGlobalScale;
|
GlobalScale = ImGui.GetIO().FontGlobalScale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ImFontGlyph the correct version.
|
||||||
|
/// </summary>
|
||||||
|
[SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:Elements should be documented", Justification = "ImGui internals")]
|
||||||
|
public struct ImFontGlyphReal
|
||||||
|
{
|
||||||
|
public uint ColoredVisibleCodepoint;
|
||||||
|
public float AdvanceX;
|
||||||
|
public float X0;
|
||||||
|
public float Y0;
|
||||||
|
public float X1;
|
||||||
|
public float Y1;
|
||||||
|
public float U0;
|
||||||
|
public float V0;
|
||||||
|
public float U1;
|
||||||
|
public float V1;
|
||||||
|
|
||||||
|
public bool Colored
|
||||||
|
{
|
||||||
|
get => ((this.ColoredVisibleCodepoint >> 0) & 1) != 0;
|
||||||
|
set => this.ColoredVisibleCodepoint = (this.ColoredVisibleCodepoint & 0xFFFFFFFEu) | (value ? 1u : 0u);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Visible
|
||||||
|
{
|
||||||
|
get => ((this.ColoredVisibleCodepoint >> 1) & 1) != 0;
|
||||||
|
set => this.ColoredVisibleCodepoint = (this.ColoredVisibleCodepoint & 0xFFFFFFFDu) | (value ? 2u : 0u);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Codepoint
|
||||||
|
{
|
||||||
|
get => (int)(this.ColoredVisibleCodepoint >> 2);
|
||||||
|
set => this.ColoredVisibleCodepoint = (this.ColoredVisibleCodepoint & 3u) | ((uint)this.Codepoint << 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -934,14 +934,14 @@ namespace Dalamud.Interface.Internal
|
||||||
font.Descent = mod.SourceAxis.ImFont.Descent;
|
font.Descent = mod.SourceAxis.ImFont.Descent;
|
||||||
font.FallbackChar = mod.SourceAxis.ImFont.FallbackChar;
|
font.FallbackChar = mod.SourceAxis.ImFont.FallbackChar;
|
||||||
font.EllipsisChar = mod.SourceAxis.ImFont.EllipsisChar;
|
font.EllipsisChar = mod.SourceAxis.ImFont.EllipsisChar;
|
||||||
Util.CopyGlyphsAcrossFonts(mod.SourceAxis.ImFont, font, false, false);
|
ImGuiHelpers.CopyGlyphsAcrossFonts(mod.SourceAxis.ImFont, font, false, false);
|
||||||
}
|
}
|
||||||
else if (mod.Axis == TargetFontModification.AxisMode.GameGlyphsOnly)
|
else if (mod.Axis == TargetFontModification.AxisMode.GameGlyphsOnly)
|
||||||
{
|
{
|
||||||
Log.Verbose("[FONT] {0}: Overwrite game specific glyphs from AXIS of size {1}px", mod.Name, mod.SourceAxis.ImFont.FontSize, font.FontSize);
|
Log.Verbose("[FONT] {0}: Overwrite game specific glyphs from AXIS of size {1}px", mod.Name, mod.SourceAxis.ImFont.FontSize, font.FontSize);
|
||||||
if (!this.UseAxis && font.NativePtr == DefaultFont.NativePtr)
|
if (!this.UseAxis && font.NativePtr == DefaultFont.NativePtr)
|
||||||
mod.SourceAxis.ImFont.FontSize -= 1;
|
mod.SourceAxis.ImFont.FontSize -= 1;
|
||||||
Util.CopyGlyphsAcrossFonts(mod.SourceAxis.ImFont, font, true, false, 0xE020, 0xE0DB);
|
ImGuiHelpers.CopyGlyphsAcrossFonts(mod.SourceAxis.ImFont, font, true, false, 0xE020, 0xE0DB);
|
||||||
if (!this.UseAxis && font.NativePtr == DefaultFont.NativePtr)
|
if (!this.UseAxis && font.NativePtr == DefaultFont.NativePtr)
|
||||||
mod.SourceAxis.ImFont.FontSize += 1;
|
mod.SourceAxis.ImFont.FontSize += 1;
|
||||||
}
|
}
|
||||||
|
|
@ -951,7 +951,7 @@ namespace Dalamud.Interface.Internal
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fill missing glyphs in MonoFont from DefaultFont
|
// Fill missing glyphs in MonoFont from DefaultFont
|
||||||
Util.CopyGlyphsAcrossFonts(DefaultFont, MonoFont, true, false);
|
ImGuiHelpers.CopyGlyphsAcrossFonts(DefaultFont, MonoFont, true, false);
|
||||||
|
|
||||||
for (int i = 0, i_ = ioFonts.Fonts.Size; i < i_; i++)
|
for (int i = 0, i_ = ioFonts.Fonts.Size; i < i_; i++)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -526,65 +526,6 @@ namespace Dalamud.Utility
|
||||||
Process.Start(process);
|
Process.Start(process);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Fills missing glyphs in target font from source font, if both are not null.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="source">Source font.</param>
|
|
||||||
/// <param name="target">Target font.</param>
|
|
||||||
/// <param name="missingOnly">Whether to copy missing glyphs only.</param>
|
|
||||||
/// <param name="rebuildLookupTable">Whether to call target.BuildLookupTable().</param>
|
|
||||||
/// <param name="rangeLow">Low codepoint range to copy.</param>
|
|
||||||
/// <param name="rangeHigh">High codepoing range to copy.</param>
|
|
||||||
public static void CopyGlyphsAcrossFonts(ImFontPtr? source, ImFontPtr? target, bool missingOnly, bool rebuildLookupTable, int rangeLow = 32, int rangeHigh = 0xFFFE)
|
|
||||||
{
|
|
||||||
if (!source.HasValue || !target.HasValue)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var scale = target.Value!.FontSize / source.Value!.FontSize;
|
|
||||||
unsafe
|
|
||||||
{
|
|
||||||
var glyphs = (ImFontGlyphReal*)source.Value!.Glyphs.Data;
|
|
||||||
for (int j = 0, j_ = source.Value!.Glyphs.Size; j < j_; j++)
|
|
||||||
{
|
|
||||||
var glyph = &glyphs[j];
|
|
||||||
if (glyph->Codepoint < rangeLow || glyph->Codepoint > rangeHigh)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var prevGlyphPtr = (ImFontGlyphReal*)target.Value!.FindGlyphNoFallback((ushort)glyph->Codepoint).NativePtr;
|
|
||||||
if ((IntPtr)prevGlyphPtr == IntPtr.Zero)
|
|
||||||
{
|
|
||||||
target.Value!.AddGlyph(
|
|
||||||
target.Value!.ConfigData,
|
|
||||||
(ushort)glyph->Codepoint,
|
|
||||||
glyph->X0 * scale,
|
|
||||||
((glyph->Y0 - source.Value!.Ascent) * scale) + target.Value!.Ascent,
|
|
||||||
glyph->X1 * scale,
|
|
||||||
((glyph->Y1 - source.Value!.Ascent) * scale) + target.Value!.Ascent,
|
|
||||||
glyph->U0,
|
|
||||||
glyph->V0,
|
|
||||||
glyph->U1,
|
|
||||||
glyph->V1,
|
|
||||||
glyph->AdvanceX * scale);
|
|
||||||
}
|
|
||||||
else if (!missingOnly)
|
|
||||||
{
|
|
||||||
prevGlyphPtr->X0 = glyph->X0 * scale;
|
|
||||||
prevGlyphPtr->Y0 = ((glyph->Y0 - source.Value!.Ascent) * scale) + target.Value!.Ascent;
|
|
||||||
prevGlyphPtr->X1 = glyph->X1 * scale;
|
|
||||||
prevGlyphPtr->Y1 = ((glyph->Y1 - source.Value!.Ascent) * scale) + target.Value!.Ascent;
|
|
||||||
prevGlyphPtr->U0 = glyph->U0;
|
|
||||||
prevGlyphPtr->V0 = glyph->V0;
|
|
||||||
prevGlyphPtr->U1 = glyph->U1;
|
|
||||||
prevGlyphPtr->V1 = glyph->V1;
|
|
||||||
prevGlyphPtr->AdvanceX = glyph->AdvanceX * scale;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rebuildLookupTable)
|
|
||||||
target.Value!.BuildLookupTable();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Dispose this object.
|
/// Dispose this object.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -649,40 +590,5 @@ namespace Dalamud.Utility
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ImFontGlyph the correct version.
|
|
||||||
/// </summary>
|
|
||||||
public struct ImFontGlyphReal
|
|
||||||
{
|
|
||||||
public uint ColoredVisibleCodepoint;
|
|
||||||
public float AdvanceX;
|
|
||||||
public float X0;
|
|
||||||
public float Y0;
|
|
||||||
public float X1;
|
|
||||||
public float Y1;
|
|
||||||
public float U0;
|
|
||||||
public float V0;
|
|
||||||
public float U1;
|
|
||||||
public float V1;
|
|
||||||
|
|
||||||
public bool Colored
|
|
||||||
{
|
|
||||||
get => ((this.ColoredVisibleCodepoint >> 0) & 1) != 0;
|
|
||||||
set => this.ColoredVisibleCodepoint = (this.ColoredVisibleCodepoint & 0xFFFFFFFEu) | (value ? 1u : 0u);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Visible
|
|
||||||
{
|
|
||||||
get => ((this.ColoredVisibleCodepoint >> 1) & 1) != 0;
|
|
||||||
set => this.ColoredVisibleCodepoint = (this.ColoredVisibleCodepoint & 0xFFFFFFFDu) | (value ? 2u : 0u);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Codepoint
|
|
||||||
{
|
|
||||||
get => (int)(this.ColoredVisibleCodepoint >> 2);
|
|
||||||
set => this.ColoredVisibleCodepoint = (this.ColoredVisibleCodepoint & 3u) | ((uint)this.Codepoint << 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue