mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-12 10:17:22 +01:00
merge net5
This commit is contained in:
commit
c1dac8d27a
34 changed files with 420 additions and 386 deletions
1
.github/workflows/main.yml
vendored
1
.github/workflows/main.yml
vendored
|
|
@ -82,6 +82,7 @@ jobs:
|
|||
} else {
|
||||
Move-Item -Force ".\canary.zip" ".\${branchName}\latest.zip"
|
||||
$versionData.AssemblyVersion = $newVersion
|
||||
$versionData | add-member -Force -Name "GitSha" $newVersion -MemberType NoteProperty
|
||||
$versionData | ConvertTo-Json -Compress | Out-File ".\${branchName}\version"
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -546,8 +546,8 @@ namespace Dalamud.Injector
|
|||
}
|
||||
catch (Exception)
|
||||
{
|
||||
gamePath = @"C:\Program Files (x86)\SquareEnix\FINAL FANTASY XIV - A Realm Reborn\game\ffxiv_dx11.exe";
|
||||
Log.Warning("Failed to read launcherConfigV3.json. Using default game installation path: {0}", gamePath);
|
||||
Log.Error("Failed to read launcherConfigV3.json to get the set-up game path, please specify one using -g");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!File.Exists(gamePath))
|
||||
|
|
|
|||
|
|
@ -18,11 +18,6 @@ namespace Dalamud.Configuration.Internal
|
|||
[Serializable]
|
||||
internal sealed class DalamudConfiguration : IServiceType
|
||||
{
|
||||
/// <summary>
|
||||
/// Currently used beta key for Dalamud staging builds.
|
||||
/// </summary>
|
||||
public const string DalamudCurrentBetaKey = "If you read this you are a beta tester for the awesome .NET 6 version of Dalamud! Hell yeah!";
|
||||
|
||||
private static readonly JsonSerializerSettings SerializerSettings = new()
|
||||
{
|
||||
TypeNameHandling = TypeNameHandling.All,
|
||||
|
|
@ -44,12 +39,6 @@ namespace Dalamud.Configuration.Internal
|
|||
/// </summary>
|
||||
public event DalamudConfigurationSavedDelegate DalamudConfigurationSaved;
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether or not Dalamud staging is enabled.
|
||||
/// </summary>
|
||||
[JsonIgnore]
|
||||
public bool IsConventionalStaging => this.DalamudBetaKey == DalamudCurrentBetaKey;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a list of muted works.
|
||||
/// </summary>
|
||||
|
|
@ -144,17 +133,6 @@ namespace Dalamud.Configuration.Internal
|
|||
/// </summary>
|
||||
public float FontGammaLevel { get; set; } = 1.4f;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating the level of font resolution between 1 to 5.
|
||||
/// 0(1024x1024), 1(2048x2048), 2(4096x4096), 3(8192x8192), 4(16384x16384).
|
||||
/// </summary>
|
||||
public int FontResolutionLevel { get; set; } = 2;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether to disable font fallback notice.
|
||||
/// </summary>
|
||||
public bool DisableFontFallbackNotice { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether or not plugin UI should be hidden.
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Label="Feature">
|
||||
<DalamudVersion>6.4.0.31</DalamudVersion>
|
||||
<DalamudVersion>6.4.0.33</DalamudVersion>
|
||||
<Description>XIV Launcher addon framework</Description>
|
||||
<AssemblyVersion>$(DalamudVersion)</AssemblyVersion>
|
||||
<Version>$(DalamudVersion)</Version>
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ using Dalamud.Configuration.Internal;
|
|||
using Dalamud.Logging.Internal;
|
||||
using Dalamud.Support;
|
||||
using Dalamud.Utility;
|
||||
using ImGuiNET;
|
||||
using Newtonsoft.Json;
|
||||
using PInvoke;
|
||||
using Serilog;
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ using System.Threading.Tasks;
|
|||
|
||||
using CheapLoc;
|
||||
using Dalamud.Configuration.Internal;
|
||||
using Dalamud.Data;
|
||||
using Dalamud.Game.Gui;
|
||||
using Dalamud.Game.Text;
|
||||
using Dalamud.Game.Text.SeStringHandling;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
using Dalamud.Data;
|
||||
|
|
@ -105,7 +104,7 @@ namespace Dalamud.Game.ClientState
|
|||
/// <summary>
|
||||
/// Gets the local player character, if one is present.
|
||||
/// </summary>
|
||||
public PlayerCharacter? LocalPlayer => Service<ObjectTable>.GetNullable()?.FirstOrDefault() as PlayerCharacter;
|
||||
public PlayerCharacter? LocalPlayer => Service<ObjectTable>.GetNullable()?[0] as PlayerCharacter;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the content ID of the local character.
|
||||
|
|
|
|||
|
|
@ -2,12 +2,6 @@ using System;
|
|||
using System.Numerics;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
using Dalamud.Configuration.Internal;
|
||||
using Dalamud.Game.Gui.ContextMenus;
|
||||
using Dalamud.Game.Gui.Dtr;
|
||||
using Dalamud.Game.Gui.FlyText;
|
||||
using Dalamud.Game.Gui.PartyFinder;
|
||||
using Dalamud.Game.Gui.Toast;
|
||||
using Dalamud.Game.Text.SeStringHandling.Payloads;
|
||||
using Dalamud.Hooking;
|
||||
using Dalamud.Interface;
|
||||
|
|
|
|||
|
|
@ -11,16 +11,22 @@ namespace Dalamud.Game.Gui.PartyFinder.Types
|
|||
/// <summary>
|
||||
/// No duty condition.
|
||||
/// </summary>
|
||||
None = 1,
|
||||
None = 1 << 0,
|
||||
|
||||
/// <summary>
|
||||
/// The duty complete condition.
|
||||
/// </summary>
|
||||
DutyComplete = 2,
|
||||
DutyComplete = 1 << 1,
|
||||
|
||||
/// <summary>
|
||||
/// The duty complete (weekly reward unclaimed) condition. This condition is
|
||||
/// only available for savage fights prior to echo release.
|
||||
/// </summary>
|
||||
DutyCompleteWeeklyRewardUnclaimed = 1 << 3,
|
||||
|
||||
/// <summary>
|
||||
/// The duty incomplete condition.
|
||||
/// </summary>
|
||||
DutyIncomplete = 4,
|
||||
DutyIncomplete = 1 << 2,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Dalamud.Configuration.Internal;
|
||||
using Serilog;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Net.Sockets;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,12 +1,9 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
using Dalamud.Configuration.Internal;
|
||||
|
||||
using Dalamud.Hooking.Internal;
|
||||
using Dalamud.Memory;
|
||||
using Reloaded.Hooks;
|
||||
|
||||
namespace Dalamud.Hooking
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
#pragma warning disable
|
||||
namespace Dalamud.Hooking.Internal
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ using Dalamud.Utility.Timing;
|
|||
using ImGuiNET;
|
||||
using Lumina.Data.Files;
|
||||
using Serilog;
|
||||
using static Dalamud.Interface.ImGuiHelpers;
|
||||
|
||||
namespace Dalamud.Interface.GameFonts
|
||||
{
|
||||
|
|
@ -39,7 +40,6 @@ namespace Dalamud.Interface.GameFonts
|
|||
private readonly Dictionary<GameFontStyle, Dictionary<char, Tuple<int, FdtReader.FontTableEntry>>> glyphRectIds = new();
|
||||
|
||||
private bool isBetweenBuildFontsAndRightAfterImGuiIoFontsBuild = false;
|
||||
private bool isBuildingAsFallbackFontMode = false;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
private GameFontManager(DataManager dataManager)
|
||||
|
|
@ -134,15 +134,18 @@ namespace Dalamud.Interface.GameFonts
|
|||
unsafe
|
||||
{
|
||||
var font = fontPtr.NativePtr;
|
||||
for (int i = 0, i_ = font->IndexAdvanceX.Size; i < i_; ++i)
|
||||
((float*)font->IndexAdvanceX.Data)[i] /= fontScale;
|
||||
font->FallbackAdvanceX /= fontScale;
|
||||
for (int i = 0, i_ = font->IndexedHotData.Size; i < i_; ++i)
|
||||
{
|
||||
font->IndexedHotData.Ref<ImFontGlyphHotDataReal>(i).AdvanceX /= fontScale;
|
||||
font->IndexedHotData.Ref<ImFontGlyphHotDataReal>(i).OccupiedWidth /= fontScale;
|
||||
}
|
||||
|
||||
font->FontSize /= fontScale;
|
||||
font->Ascent /= fontScale;
|
||||
font->Descent /= fontScale;
|
||||
if (font->ConfigData != null)
|
||||
font->ConfigData->SizePixels /= fontScale;
|
||||
var glyphs = (ImGuiHelpers.ImFontGlyphReal*)font->Glyphs.Data;
|
||||
var glyphs = (ImFontGlyphReal*)font->Glyphs.Data;
|
||||
for (int i = 0, i_ = font->Glyphs.Size; i < i_; i++)
|
||||
{
|
||||
var glyph = &glyphs[i];
|
||||
|
|
@ -152,6 +155,11 @@ namespace Dalamud.Interface.GameFonts
|
|||
glyph->Y1 /= fontScale;
|
||||
glyph->AdvanceX /= fontScale;
|
||||
}
|
||||
|
||||
for (int i = 0, i_ = font->KerningPairs.Size; i < i_; i++)
|
||||
font->KerningPairs.Ref<ImFontKerningPair>(i).AdvanceXAdjustment /= fontScale;
|
||||
for (int i = 0, i_ = font->FrequentKerningPairs.Size; i < i_; i++)
|
||||
font->FrequentKerningPairs.Ref<float>(i) /= fontScale;
|
||||
}
|
||||
|
||||
if (rebuildLookupTable)
|
||||
|
|
@ -244,17 +252,18 @@ namespace Dalamud.Interface.GameFonts
|
|||
/// <summary>
|
||||
/// Build fonts before plugins do something more. To be called from InterfaceManager.
|
||||
/// </summary>
|
||||
/// <param name="forceMinSize">Whether to load fonts in minimum sizes.</param>
|
||||
public void BuildFonts(bool forceMinSize)
|
||||
public void BuildFonts()
|
||||
{
|
||||
this.isBuildingAsFallbackFontMode = forceMinSize;
|
||||
this.isBetweenBuildFontsAndRightAfterImGuiIoFontsBuild = true;
|
||||
|
||||
this.glyphRectIds.Clear();
|
||||
this.fonts.Clear();
|
||||
|
||||
foreach (var style in this.fontUseCounter.Keys)
|
||||
this.EnsureFont(style);
|
||||
lock (this.syncRoot)
|
||||
{
|
||||
foreach (var style in this.fontUseCounter.Keys)
|
||||
this.EnsureFont(style);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -279,13 +288,21 @@ namespace Dalamud.Interface.GameFonts
|
|||
{
|
||||
var interfaceManager = Service<InterfaceManager>.Get();
|
||||
var ioFonts = ImGui.GetIO().Fonts;
|
||||
ioFonts.GetTexDataAsRGBA32(out byte* pixels8, out var width, out var height);
|
||||
var pixels32 = (uint*)pixels8;
|
||||
var fontGamma = interfaceManager.FontGamma;
|
||||
|
||||
var pixels8s = new byte*[ioFonts.Textures.Size];
|
||||
var pixels32s = new uint*[ioFonts.Textures.Size];
|
||||
var widths = new int[ioFonts.Textures.Size];
|
||||
var heights = new int[ioFonts.Textures.Size];
|
||||
for (var i = 0; i < pixels8s.Length; i++)
|
||||
{
|
||||
ioFonts.GetTexDataAsRGBA32(i, out pixels8s[i], out widths[i], out heights[i]);
|
||||
pixels32s[i] = (uint*)pixels8s[i];
|
||||
}
|
||||
|
||||
foreach (var (style, font) in this.fonts)
|
||||
{
|
||||
var fdt = this.fdts[(int)(this.isBuildingAsFallbackFontMode ? style.FamilyWithMinimumSize : style.FamilyAndSize)];
|
||||
var fdt = this.fdts[(int)style.FamilyAndSize];
|
||||
var scale = style.SizePt / fdt.FontHeader.Size;
|
||||
var fontPtr = font.NativePtr;
|
||||
|
||||
|
|
@ -302,7 +319,10 @@ namespace Dalamud.Interface.GameFonts
|
|||
var glyph = font.FindGlyphNoFallback(fallbackCharCandidate);
|
||||
if ((IntPtr)glyph.NativePtr != IntPtr.Zero)
|
||||
{
|
||||
font.SetFallbackChar(fallbackCharCandidate);
|
||||
var ptr = font.NativePtr;
|
||||
ptr->FallbackChar = fallbackCharCandidate;
|
||||
ptr->FallbackGlyph = glyph.NativePtr;
|
||||
ptr->FallbackHotData = (ImFontGlyphHotData*)ptr->IndexedHotData.Address<ImFontGlyphHotDataReal>(fallbackCharCandidate);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -323,7 +343,11 @@ namespace Dalamud.Interface.GameFonts
|
|||
|
||||
foreach (var (c, (rectId, glyph)) in this.glyphRectIds[style])
|
||||
{
|
||||
var rc = ioFonts.GetCustomRectByIndex(rectId);
|
||||
var rc = (ImFontAtlasCustomRectReal*)ioFonts.GetCustomRectByIndex(rectId).NativePtr;
|
||||
var pixels8 = pixels8s[rc->TextureIndex];
|
||||
var pixels32 = pixels32s[rc->TextureIndex];
|
||||
var width = widths[rc->TextureIndex];
|
||||
var height = heights[rc->TextureIndex];
|
||||
var sourceBuffer = this.texturePixels[glyph.TextureFileIndex];
|
||||
var sourceBufferDelta = glyph.TextureChannelByteIndex;
|
||||
var widthAdjustment = style.CalculateBaseWidthAdjustment(fdt, glyph);
|
||||
|
|
@ -334,7 +358,7 @@ namespace Dalamud.Interface.GameFonts
|
|||
for (var x = 0; x < glyph.BoundingWidth; x++)
|
||||
{
|
||||
var a = sourceBuffer[sourceBufferDelta + (4 * (((glyph.TextureOffsetY + y) * fdt.FontHeader.TextureWidth) + glyph.TextureOffsetX + x))];
|
||||
pixels32[((rc.Y + y) * width) + rc.X + x] = (uint)(a << 24) | 0xFFFFFFu;
|
||||
pixels32[((rc->Y + y) * width) + rc->X + x] = (uint)(a << 24) | 0xFFFFFFu;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -343,7 +367,7 @@ namespace Dalamud.Interface.GameFonts
|
|||
for (var y = 0; y < glyph.BoundingHeight; y++)
|
||||
{
|
||||
for (var x = 0; x < glyph.BoundingWidth + widthAdjustment; x++)
|
||||
pixels32[((rc.Y + y) * width) + rc.X + x] = 0xFFFFFFu;
|
||||
pixels32[((rc->Y + y) * width) + rc->X + x] = 0xFFFFFFu;
|
||||
}
|
||||
|
||||
for (int xbold = 0, xbold_ = Math.Max(1, (int)Math.Ceiling(style.Weight + 1)); xbold < xbold_; xbold++)
|
||||
|
|
@ -364,7 +388,7 @@ namespace Dalamud.Interface.GameFonts
|
|||
var a1 = sourceBuffer[sourceBufferDelta + (4 * sourcePixelIndex)];
|
||||
var a2 = x == glyph.BoundingWidth - 1 ? 0 : sourceBuffer[sourceBufferDelta + (4 * (sourcePixelIndex + 1))];
|
||||
var n = (a1 * xness) + (a2 * (1 - xness));
|
||||
var targetOffset = ((rc.Y + y) * width) + rc.X + x + xDeltaInt;
|
||||
var targetOffset = ((rc->Y + y) * width) + rc->X + x + xDeltaInt;
|
||||
pixels8[(targetOffset * 4) + 3] = Math.Max(pixels8[(targetOffset * 4) + 3], (byte)(boldStrength * n));
|
||||
}
|
||||
}
|
||||
|
|
@ -374,9 +398,9 @@ namespace Dalamud.Interface.GameFonts
|
|||
if (Math.Abs(fontGamma - 1.4f) >= 0.001)
|
||||
{
|
||||
// Gamma correction (stbtt/FreeType would output in linear space whereas most real world usages will apply 1.4 or 1.8 gamma; Windows/XIV prebaked uses 1.4)
|
||||
for (int y = rc.Y, y_ = rc.Y + rc.Height; y < y_; y++)
|
||||
for (int y = rc->Y, y_ = rc->Y + rc->Height; y < y_; y++)
|
||||
{
|
||||
for (int x = rc.X, x_ = rc.X + rc.Width; x < x_; x++)
|
||||
for (int x = rc->X, x_ = rc->X + rc->Width; x < x_; x++)
|
||||
{
|
||||
var i = (((y * width) + x) * 4) + 3;
|
||||
pixels8[i] = (byte)(Math.Pow(pixels8[i] / 255.0f, 1.4f / fontGamma) * 255.0f);
|
||||
|
|
@ -409,7 +433,7 @@ namespace Dalamud.Interface.GameFonts
|
|||
{
|
||||
var rectIds = this.glyphRectIds[style] = new();
|
||||
|
||||
var fdt = this.fdts[(int)(this.isBuildingAsFallbackFontMode ? style.FamilyWithMinimumSize : style.FamilyAndSize)];
|
||||
var fdt = this.fdts[(int)style.FamilyAndSize];
|
||||
if (fdt == null)
|
||||
return;
|
||||
|
||||
|
|
@ -435,12 +459,15 @@ namespace Dalamud.Interface.GameFonts
|
|||
io.Fonts.AddCustomRectFontGlyph(
|
||||
font,
|
||||
c,
|
||||
glyph.BoundingWidth + widthAdjustment + 1,
|
||||
glyph.BoundingHeight + 1,
|
||||
glyph.BoundingWidth + widthAdjustment,
|
||||
glyph.BoundingHeight,
|
||||
glyph.AdvanceWidth,
|
||||
new Vector2(0, glyph.CurrentOffsetY)),
|
||||
glyph);
|
||||
}
|
||||
|
||||
foreach (var kernPair in fdt.Distances)
|
||||
font.AddKerningPair(kernPair.Left, kernPair.Right, kernPair.RightOffset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -462,13 +462,13 @@ namespace Dalamud.Interface.ImGuiFileDialog
|
|||
|
||||
if (this.pathInputActivated)
|
||||
{
|
||||
if (ImGui.IsKeyReleased(ImGui.GetKeyIndex(ImGuiKey.Enter)))
|
||||
if (ImGui.IsKeyReleased(ImGuiKey.Enter))
|
||||
{
|
||||
if (Directory.Exists(this.pathInputBuffer)) this.SetPath(this.pathInputBuffer);
|
||||
this.pathInputActivated = false;
|
||||
}
|
||||
|
||||
if (ImGui.IsKeyReleased(ImGui.GetKeyIndex(ImGuiKey.Escape)))
|
||||
if (ImGui.IsKeyReleased(ImGuiKey.Escape))
|
||||
{
|
||||
this.pathInputActivated = false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -161,6 +161,7 @@ namespace Dalamud.Interface
|
|||
return;
|
||||
|
||||
var scale = target.Value!.FontSize / source.Value!.FontSize;
|
||||
var addedCodepoints = new HashSet<int>();
|
||||
unsafe
|
||||
{
|
||||
var glyphs = (ImFontGlyphReal*)source.Value!.Glyphs.Data;
|
||||
|
|
@ -175,9 +176,11 @@ namespace Dalamud.Interface
|
|||
var prevGlyphPtr = (ImFontGlyphReal*)target.Value!.FindGlyphNoFallback((ushort)glyph->Codepoint).NativePtr;
|
||||
if ((IntPtr)prevGlyphPtr == IntPtr.Zero)
|
||||
{
|
||||
addedCodepoints.Add(glyph->Codepoint);
|
||||
target.Value!.AddGlyph(
|
||||
target.Value!.ConfigData,
|
||||
(ushort)glyph->Codepoint,
|
||||
glyph->TextureIndex,
|
||||
glyph->X0 * scale,
|
||||
((glyph->Y0 - source.Value!.Ascent) * scale) + target.Value!.Ascent,
|
||||
glyph->X1 * scale,
|
||||
|
|
@ -190,6 +193,8 @@ namespace Dalamud.Interface
|
|||
}
|
||||
else if (!missingOnly)
|
||||
{
|
||||
addedCodepoints.Add(glyph->Codepoint);
|
||||
prevGlyphPtr->TextureIndex = glyph->TextureIndex;
|
||||
prevGlyphPtr->X0 = glyph->X0 * scale;
|
||||
prevGlyphPtr->Y0 = ((glyph->Y0 - source.Value!.Ascent) * scale) + target.Value!.Ascent;
|
||||
prevGlyphPtr->X1 = glyph->X1 * scale;
|
||||
|
|
@ -201,6 +206,16 @@ namespace Dalamud.Interface
|
|||
prevGlyphPtr->AdvanceX = glyph->AdvanceX * scale;
|
||||
}
|
||||
}
|
||||
|
||||
var kernPairs = source.Value!.KerningPairs;
|
||||
for (int j = 0, k = kernPairs.Size; j < k; j++)
|
||||
{
|
||||
if (!addedCodepoints.Contains(kernPairs[j].Left))
|
||||
continue;
|
||||
if (!addedCodepoints.Contains(kernPairs[j].Right))
|
||||
continue;
|
||||
target.Value.AddKerningPair(kernPairs[j].Left, kernPairs[j].Right, kernPairs[j].AdvanceXAdjustment);
|
||||
}
|
||||
}
|
||||
|
||||
if (rebuildLookupTable)
|
||||
|
|
@ -221,7 +236,7 @@ namespace Dalamud.Interface
|
|||
[SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:Elements should be documented", Justification = "ImGui internals")]
|
||||
public struct ImFontGlyphReal
|
||||
{
|
||||
public uint ColoredVisibleCodepoint;
|
||||
public uint ColoredVisibleTextureIndexCodepoint;
|
||||
public float AdvanceX;
|
||||
public float X0;
|
||||
public float Y0;
|
||||
|
|
@ -232,23 +247,110 @@ namespace Dalamud.Interface
|
|||
public float U1;
|
||||
public float V1;
|
||||
|
||||
private const uint ColoredMask /*****/ = 0b_00000000_00000000_00000000_00000001u;
|
||||
private const uint VisibleMask /*****/ = 0b_00000000_00000000_00000000_00000010u;
|
||||
private const uint TextureMask /*****/ = 0b_00000000_00000000_00000111_11111100u;
|
||||
private const uint CodepointMask /***/ = 0b_11111111_11111111_11111000_00000000u;
|
||||
|
||||
private const int ColoredShift = 0;
|
||||
private const int VisibleShift = 1;
|
||||
private const int TextureShift = 2;
|
||||
private const int CodepointShift = 11;
|
||||
|
||||
public bool Colored
|
||||
{
|
||||
get => ((this.ColoredVisibleCodepoint >> 0) & 1) != 0;
|
||||
set => this.ColoredVisibleCodepoint = (this.ColoredVisibleCodepoint & 0xFFFFFFFEu) | (value ? 1u : 0u);
|
||||
get => (int)((this.ColoredVisibleTextureIndexCodepoint & ColoredMask) >> ColoredShift) != 0;
|
||||
set => this.ColoredVisibleTextureIndexCodepoint = (this.ColoredVisibleTextureIndexCodepoint & ~ColoredMask) | (value ? 1u << ColoredShift : 0u);
|
||||
}
|
||||
|
||||
public bool Visible
|
||||
{
|
||||
get => ((this.ColoredVisibleCodepoint >> 1) & 1) != 0;
|
||||
set => this.ColoredVisibleCodepoint = (this.ColoredVisibleCodepoint & 0xFFFFFFFDu) | (value ? 2u : 0u);
|
||||
get => (int)((this.ColoredVisibleTextureIndexCodepoint & VisibleMask) >> VisibleShift) != 0;
|
||||
set => this.ColoredVisibleTextureIndexCodepoint = (this.ColoredVisibleTextureIndexCodepoint & ~VisibleMask) | (value ? 1u << VisibleShift : 0u);
|
||||
}
|
||||
|
||||
public int TextureIndex
|
||||
{
|
||||
get => (int)(this.ColoredVisibleTextureIndexCodepoint & TextureMask) >> TextureShift;
|
||||
set => this.ColoredVisibleTextureIndexCodepoint = (this.ColoredVisibleTextureIndexCodepoint & ~TextureMask) | ((uint)value << TextureShift);
|
||||
}
|
||||
|
||||
public int Codepoint
|
||||
{
|
||||
get => (int)(this.ColoredVisibleCodepoint >> 2);
|
||||
set => this.ColoredVisibleCodepoint = (this.ColoredVisibleCodepoint & 3u) | ((uint)value << 2);
|
||||
get => (int)(this.ColoredVisibleTextureIndexCodepoint & CodepointMask) >> CodepointShift;
|
||||
set => this.ColoredVisibleTextureIndexCodepoint = (this.ColoredVisibleTextureIndexCodepoint & ~CodepointMask) | ((uint)value << CodepointShift);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ImFontGlyphHotData the correct version.
|
||||
/// </summary>
|
||||
[SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:Elements should be documented", Justification = "ImGui internals")]
|
||||
public struct ImFontGlyphHotDataReal
|
||||
{
|
||||
public float AdvanceX;
|
||||
public float OccupiedWidth;
|
||||
public uint KerningPairInfo;
|
||||
|
||||
private const uint UseBisectMask /***/ = 0b_00000000_00000000_00000000_00000001u;
|
||||
private const uint OffsetMask /******/ = 0b_00000000_00001111_11111111_11111110u;
|
||||
private const uint CountMask /*******/ = 0b_11111111_11110000_00000111_11111100u;
|
||||
|
||||
private const int UseBisectShift = 0;
|
||||
private const int OffsetShift = 1;
|
||||
private const int CountShift = 20;
|
||||
|
||||
public bool UseBisect
|
||||
{
|
||||
get => (int)((this.KerningPairInfo & UseBisectMask) >> UseBisectShift) != 0;
|
||||
set => this.KerningPairInfo = (this.KerningPairInfo & ~UseBisectMask) | (value ? 1u << UseBisectShift : 0u);
|
||||
}
|
||||
|
||||
public bool Offset
|
||||
{
|
||||
get => (int)((this.KerningPairInfo & OffsetMask) >> OffsetShift) != 0;
|
||||
set => this.KerningPairInfo = (this.KerningPairInfo & ~OffsetMask) | (value ? 1u << OffsetShift : 0u);
|
||||
}
|
||||
|
||||
public int Count
|
||||
{
|
||||
get => (int)(this.KerningPairInfo & CountMask) >> CountShift;
|
||||
set => this.KerningPairInfo = (this.KerningPairInfo & ~CountMask) | ((uint)value << CountShift);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ImFontAtlasCustomRect the correct version.
|
||||
/// </summary>
|
||||
[SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1600:Elements should be documented", Justification = "ImGui internals")]
|
||||
public unsafe struct ImFontAtlasCustomRectReal
|
||||
{
|
||||
public ushort Width;
|
||||
public ushort Height;
|
||||
public ushort X;
|
||||
public ushort Y;
|
||||
public uint TextureIndexAndGlyphID;
|
||||
public float GlyphAdvanceX;
|
||||
public Vector2 GlyphOffset;
|
||||
public ImFont* Font;
|
||||
|
||||
private const uint TextureIndexMask /***/ = 0b_00000000_00000000_00000111_11111100u;
|
||||
private const uint GlyphIDMask /********/ = 0b_11111111_11111111_11111000_00000000u;
|
||||
|
||||
private const int TextureIndexShift = 2;
|
||||
private const int GlyphIDShift = 11;
|
||||
|
||||
public int TextureIndex
|
||||
{
|
||||
get => (int)(this.TextureIndexAndGlyphID & TextureIndexMask) >> TextureIndexShift;
|
||||
set => this.TextureIndexAndGlyphID = (this.TextureIndexAndGlyphID & ~TextureIndexMask) | ((uint)value << TextureIndexShift);
|
||||
}
|
||||
|
||||
public int GlyphID
|
||||
{
|
||||
get => (int)(this.TextureIndexAndGlyphID & GlyphIDMask) >> GlyphIDShift;
|
||||
set => this.TextureIndexAndGlyphID = (this.TextureIndexAndGlyphID & ~GlyphIDMask) | ((uint)value << GlyphIDShift);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ using FFXIVClientStructs.FFXIV.Client.System.Framework;
|
|||
using FFXIVClientStructs.FFXIV.Client.UI;
|
||||
using ImGuiNET;
|
||||
using ImGuiScene;
|
||||
using ImPlotNET;
|
||||
using PInvoke;
|
||||
using Serilog.Events;
|
||||
|
||||
|
|
@ -54,8 +55,8 @@ namespace Dalamud.Interface.Internal
|
|||
private readonly SelfTestWindow selfTestWindow;
|
||||
private readonly StyleEditorWindow styleEditorWindow;
|
||||
private readonly TitleScreenMenuWindow titleScreenMenuWindow;
|
||||
private readonly FallbackFontNoticeWindow fallbackFontNoticeWindow;
|
||||
private readonly ProfilerWindow profilerWindow;
|
||||
private readonly BranchSwitcherWindow branchSwitcherWindow;
|
||||
|
||||
private readonly TextureWrap logoTexture;
|
||||
private readonly TextureWrap tsmLogoTexture;
|
||||
|
|
@ -71,6 +72,7 @@ namespace Dalamud.Interface.Internal
|
|||
#endif
|
||||
|
||||
private bool isImGuiDrawDemoWindow = false;
|
||||
private bool isImPlotDrawDemoWindow = false;
|
||||
private bool isImGuiTestWindowsInMonospace = false;
|
||||
private bool isImGuiDrawMetricsWindow = false;
|
||||
|
||||
|
|
@ -98,8 +100,8 @@ namespace Dalamud.Interface.Internal
|
|||
this.selfTestWindow = new SelfTestWindow() { IsOpen = false };
|
||||
this.styleEditorWindow = new StyleEditorWindow() { IsOpen = false };
|
||||
this.titleScreenMenuWindow = new TitleScreenMenuWindow() { IsOpen = false };
|
||||
this.fallbackFontNoticeWindow = new FallbackFontNoticeWindow() { IsOpen = interfaceManager.IsFallbackFontMode && !configuration.DisableFontFallbackNotice };
|
||||
this.profilerWindow = new ProfilerWindow() { IsOpen = false };
|
||||
this.branchSwitcherWindow = new BranchSwitcherWindow() { IsOpen = false };
|
||||
|
||||
this.WindowSystem.AddWindow(this.changelogWindow);
|
||||
this.WindowSystem.AddWindow(this.colorDemoWindow);
|
||||
|
|
@ -115,8 +117,8 @@ namespace Dalamud.Interface.Internal
|
|||
this.WindowSystem.AddWindow(this.selfTestWindow);
|
||||
this.WindowSystem.AddWindow(this.styleEditorWindow);
|
||||
this.WindowSystem.AddWindow(this.titleScreenMenuWindow);
|
||||
this.WindowSystem.AddWindow(this.fallbackFontNoticeWindow);
|
||||
this.WindowSystem.AddWindow(this.profilerWindow);
|
||||
this.WindowSystem.AddWindow(this.branchSwitcherWindow);
|
||||
|
||||
ImGuiManagedAsserts.AssertsEnabled = configuration.AssertsEnabledAtStartup;
|
||||
this.isImGuiDrawDevMenu = this.isImGuiDrawDevMenu || configuration.DevBarOpenAtStartup;
|
||||
|
|
@ -140,7 +142,7 @@ namespace Dalamud.Interface.Internal
|
|||
tsm.AddEntryCore(Loc.Localize("TSMDalamudPlugins", "Plugin Installer"), this.tsmLogoTexture, () => this.pluginWindow.IsOpen = true);
|
||||
tsm.AddEntryCore(Loc.Localize("TSMDalamudSettings", "Dalamud Settings"), this.tsmLogoTexture, () => this.settingsWindow.IsOpen = true);
|
||||
|
||||
if (configuration.IsConventionalStaging)
|
||||
if (!configuration.DalamudBetaKind.IsNullOrEmpty())
|
||||
{
|
||||
tsm.AddEntryCore(Loc.Localize("TSMDalamudDevMenu", "Developer Menu"), this.tsmLogoTexture, () => this.isImGuiDrawDevMenu = true);
|
||||
}
|
||||
|
|
@ -222,11 +224,6 @@ namespace Dalamud.Interface.Internal
|
|||
/// </summary>
|
||||
public void OpenDevMenu() => this.isImGuiDrawDevMenu = true;
|
||||
|
||||
/// <summary>
|
||||
/// Opens the fallback font notice window.
|
||||
/// </summary>
|
||||
public void OpenFallbackFontNoticeWindow() => this.fallbackFontNoticeWindow.IsOpen = true;
|
||||
|
||||
/// <summary>
|
||||
/// Opens the <see cref="GamepadModeNotifierWindow"/>.
|
||||
/// </summary>
|
||||
|
|
@ -272,6 +269,11 @@ namespace Dalamud.Interface.Internal
|
|||
/// </summary>
|
||||
public void OpenProfiler() => this.profilerWindow.IsOpen = true;
|
||||
|
||||
/// <summary>
|
||||
/// Opens the <see cref="BranchSwitcherWindow"/>
|
||||
/// </summary>
|
||||
public void OpenBranchSwitcher() => this.branchSwitcherWindow.IsOpen = true;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Close
|
||||
|
|
@ -408,6 +410,9 @@ namespace Dalamud.Interface.Internal
|
|||
if (this.isImGuiDrawDemoWindow)
|
||||
ImGui.ShowDemoWindow(ref this.isImGuiDrawDemoWindow);
|
||||
|
||||
if (this.isImPlotDrawDemoWindow)
|
||||
ImPlot.ShowDemoWindow(ref this.isImPlotDrawDemoWindow);
|
||||
|
||||
if (this.isImGuiDrawMetricsWindow)
|
||||
ImGui.ShowMetricsWindow(ref this.isImGuiDrawMetricsWindow);
|
||||
|
||||
|
|
@ -621,17 +626,15 @@ namespace Dalamud.Interface.Internal
|
|||
|
||||
ImGui.Separator();
|
||||
|
||||
var isBeta = configuration.DalamudBetaKey == DalamudConfiguration.DalamudCurrentBetaKey;
|
||||
if (ImGui.MenuItem("Enable Dalamud testing", string.Empty, isBeta))
|
||||
if (ImGui.MenuItem("Open Dalamud branch switcher"))
|
||||
{
|
||||
configuration.DalamudBetaKey = isBeta ? null : DalamudConfiguration.DalamudCurrentBetaKey;
|
||||
configuration.Save();
|
||||
this.OpenBranchSwitcher();
|
||||
}
|
||||
|
||||
var startInfo = Service<DalamudStartInfo>.Get();
|
||||
ImGui.MenuItem(Util.AssemblyVersion, false);
|
||||
ImGui.MenuItem(startInfo.GameVersion.ToString(), false);
|
||||
ImGui.MenuItem($"CS: {Util.GetGitHashClientStructs()}", false);
|
||||
ImGui.MenuItem($"D: {Util.GetGitHash()} CS: {Util.GetGitHashClientStructs()}", false);
|
||||
|
||||
ImGui.EndMenu();
|
||||
}
|
||||
|
|
@ -640,6 +643,7 @@ namespace Dalamud.Interface.Internal
|
|||
{
|
||||
ImGui.MenuItem("Use Monospace font for following windows", string.Empty, ref this.isImGuiTestWindowsInMonospace);
|
||||
ImGui.MenuItem("Draw ImGui demo", string.Empty, ref this.isImGuiDrawDemoWindow);
|
||||
ImGui.MenuItem("Draw ImPlot demo", string.Empty, ref this.isImPlotDrawDemoWindow);
|
||||
ImGui.MenuItem("Draw metrics", string.Empty, ref this.isImGuiDrawMetricsWindow);
|
||||
|
||||
ImGui.Separator();
|
||||
|
|
|
|||
|
|
@ -47,8 +47,6 @@ namespace Dalamud.Interface.Internal
|
|||
[ServiceManager.BlockingEarlyLoadedService]
|
||||
internal class InterfaceManager : IDisposable, IServiceType
|
||||
{
|
||||
private const float MinimumFallbackFontSizePt = 9.6f; // Game's minimum AXIS font size
|
||||
private const float MinimumFallbackFontSizePx = MinimumFallbackFontSizePt * 4.0f / 3.0f;
|
||||
private const float DefaultFontSizePt = 12.0f;
|
||||
private const float DefaultFontSizePx = DefaultFontSizePt * 4.0f / 3.0f;
|
||||
private const ushort Fallback1Codepoint = 0x3013; // Geta mark; FFXIV uses this to indicate that a glyph is missing.
|
||||
|
|
@ -72,7 +70,6 @@ namespace Dalamud.Interface.Internal
|
|||
// can't access imgui IO before first present call
|
||||
private bool lastWantCapture = false;
|
||||
private bool isRebuildingFonts = false;
|
||||
private bool isFallbackFontMode = false;
|
||||
private bool isOverrideGameCursor = true;
|
||||
|
||||
[ServiceManager.ServiceConstructor]
|
||||
|
|
@ -120,11 +117,6 @@ namespace Dalamud.Interface.Internal
|
|||
/// </summary>
|
||||
public event Action AfterBuildFonts;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets an action that is executed right after font fallback mode has been changed.
|
||||
/// </summary>
|
||||
public event Action<bool> FallbackFontModeChange;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the default ImGui font.
|
||||
/// </summary>
|
||||
|
|
@ -184,22 +176,6 @@ namespace Dalamud.Interface.Internal
|
|||
/// </summary>
|
||||
public bool IsDispatchingEvents { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether the font has been loaded in fallback mode.
|
||||
/// </summary>
|
||||
public bool IsFallbackFontMode
|
||||
{
|
||||
get => this.isFallbackFontMode;
|
||||
internal set
|
||||
{
|
||||
if (value == this.isFallbackFontMode)
|
||||
return;
|
||||
|
||||
this.isFallbackFontMode = value;
|
||||
this.FallbackFontModeChange?.Invoke(value);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether to override configuration for UseAxis.
|
||||
/// </summary>
|
||||
|
|
@ -220,16 +196,6 @@ namespace Dalamud.Interface.Internal
|
|||
/// </summary>
|
||||
public float FontGamma => Math.Max(0.1f, this.FontGammaOverride.GetValueOrDefault(Service<DalamudConfiguration>.Get().FontGammaLevel));
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether to override configuration for FontResolutionLevel.
|
||||
/// </summary>
|
||||
public int? FontResolutionLevelOverride { get; set; } = null;
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating the level of font resolution.
|
||||
/// </summary>
|
||||
public int FontResolutionLevel => this.FontResolutionLevelOverride ?? Service<DalamudConfiguration>.Get().FontResolutionLevel;
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether we're building fonts but haven't generated atlas yet.
|
||||
/// </summary>
|
||||
|
|
@ -608,8 +574,7 @@ namespace Dalamud.Interface.Internal
|
|||
/// <summary>
|
||||
/// Loads font for use in ImGui text functions.
|
||||
/// </summary>
|
||||
/// <param name="disableBigFonts">If set, then glyphs will be loaded in smaller resolution to make all glyphs fit into given constraints.</param>
|
||||
private unsafe void SetupFonts(bool disableBigFonts = false)
|
||||
private unsafe void SetupFonts()
|
||||
{
|
||||
using var setupFontsTimings = Timings.Start("IM SetupFonts");
|
||||
|
||||
|
|
@ -618,12 +583,11 @@ namespace Dalamud.Interface.Internal
|
|||
var io = ImGui.GetIO();
|
||||
var ioFonts = io.Fonts;
|
||||
|
||||
var maxTexDimension = 1 << (10 + Math.Max(0, Math.Min(4, this.FontResolutionLevel)));
|
||||
var fontGamma = this.FontGamma;
|
||||
|
||||
this.fontBuildSignal.Reset();
|
||||
ioFonts.Clear();
|
||||
ioFonts.TexDesiredWidth = maxTexDimension;
|
||||
ioFonts.TexDesiredWidth = 4096;
|
||||
|
||||
Log.Verbose("[FONT] SetupFonts - 1");
|
||||
|
||||
|
|
@ -666,10 +630,9 @@ namespace Dalamud.Interface.Internal
|
|||
"Default",
|
||||
this.UseAxis ? TargetFontModification.AxisMode.Overwrite : TargetFontModification.AxisMode.GameGlyphsOnly,
|
||||
this.UseAxis ? DefaultFontSizePx : DefaultFontSizePx + 1,
|
||||
io.FontGlobalScale,
|
||||
disableBigFonts);
|
||||
io.FontGlobalScale);
|
||||
Log.Verbose("[FONT] SetupFonts - Default corresponding AXIS size: {0}pt ({1}px)", fontInfo.SourceAxis.Style.BaseSizePt, fontInfo.SourceAxis.Style.BaseSizePx);
|
||||
fontConfig.SizePixels = disableBigFonts ? Math.Min(MinimumFallbackFontSizePx, fontInfo.TargetSizePx) : fontInfo.TargetSizePx * io.FontGlobalScale;
|
||||
fontConfig.SizePixels = fontInfo.TargetSizePx * io.FontGlobalScale;
|
||||
if (this.UseAxis)
|
||||
{
|
||||
fontConfig.GlyphRanges = dummyRangeHandle.AddrOfPinnedObject();
|
||||
|
|
@ -709,8 +672,8 @@ namespace Dalamud.Interface.Internal
|
|||
|
||||
fontConfig.GlyphRanges = iconRangeHandle.AddrOfPinnedObject();
|
||||
fontConfig.PixelSnapH = true;
|
||||
IconFont = ioFonts.AddFontFromFileTTF(fontPathIcon, disableBigFonts ? Math.Min(MinimumFallbackFontSizePx, DefaultFontSizePx) : DefaultFontSizePx * io.FontGlobalScale, fontConfig);
|
||||
this.loadedFontInfo[IconFont] = new("Icon", TargetFontModification.AxisMode.GameGlyphsOnly, DefaultFontSizePx, io.FontGlobalScale, disableBigFonts);
|
||||
IconFont = ioFonts.AddFontFromFileTTF(fontPathIcon, DefaultFontSizePx * io.FontGlobalScale, fontConfig);
|
||||
this.loadedFontInfo[IconFont] = new("Icon", TargetFontModification.AxisMode.GameGlyphsOnly, DefaultFontSizePx, io.FontGlobalScale);
|
||||
}
|
||||
|
||||
// Monospace font
|
||||
|
|
@ -722,8 +685,8 @@ namespace Dalamud.Interface.Internal
|
|||
|
||||
fontConfig.GlyphRanges = IntPtr.Zero;
|
||||
fontConfig.PixelSnapH = true;
|
||||
MonoFont = ioFonts.AddFontFromFileTTF(fontPathMono, disableBigFonts ? Math.Min(MinimumFallbackFontSizePx, DefaultFontSizePx) : DefaultFontSizePx * io.FontGlobalScale, fontConfig);
|
||||
this.loadedFontInfo[MonoFont] = new("Mono", TargetFontModification.AxisMode.GameGlyphsOnly, DefaultFontSizePx, io.FontGlobalScale, disableBigFonts);
|
||||
MonoFont = ioFonts.AddFontFromFileTTF(fontPathMono, DefaultFontSizePx * io.FontGlobalScale, fontConfig);
|
||||
this.loadedFontInfo[MonoFont] = new("Mono", TargetFontModification.AxisMode.GameGlyphsOnly, DefaultFontSizePx, io.FontGlobalScale);
|
||||
}
|
||||
|
||||
// Default font but in requested size for requested glyphs
|
||||
|
|
@ -775,8 +738,7 @@ namespace Dalamud.Interface.Internal
|
|||
$"Requested({fontSize}px)",
|
||||
this.UseAxis ? TargetFontModification.AxisMode.Overwrite : TargetFontModification.AxisMode.GameGlyphsOnly,
|
||||
fontSize,
|
||||
io.FontGlobalScale,
|
||||
disableBigFonts);
|
||||
io.FontGlobalScale);
|
||||
if (this.UseAxis)
|
||||
{
|
||||
fontConfig.GlyphRanges = dummyRangeHandle.AddrOfPinnedObject();
|
||||
|
|
@ -794,7 +756,7 @@ namespace Dalamud.Interface.Internal
|
|||
garbageList.Add(rangeHandle);
|
||||
fontConfig.PixelSnapH = true;
|
||||
|
||||
var sizedFont = ioFonts.AddFontFromFileTTF(fontPathJp, disableBigFonts ? Math.Min(MinimumFallbackFontSizePx, fontSize) : fontSize * io.FontGlobalScale, fontConfig, rangeHandle.AddrOfPinnedObject());
|
||||
var sizedFont = ioFonts.AddFontFromFileTTF(fontPathJp, fontSize * io.FontGlobalScale, fontConfig, rangeHandle.AddrOfPinnedObject());
|
||||
this.loadedFontInfo[sizedFont] = fontInfo;
|
||||
foreach (var request in requests)
|
||||
request.FontInternal = sizedFont;
|
||||
|
|
@ -802,7 +764,7 @@ namespace Dalamud.Interface.Internal
|
|||
}
|
||||
}
|
||||
|
||||
gameFontManager.BuildFonts(disableBigFonts);
|
||||
gameFontManager.BuildFonts();
|
||||
|
||||
var customFontFirstConfigIndex = ioFonts.ConfigData.Size;
|
||||
|
||||
|
|
@ -844,17 +806,13 @@ namespace Dalamud.Interface.Internal
|
|||
this.loadedFontInfo[config.DstFont.NativePtr] = new($"PlReq({name})", config.SizePixels);
|
||||
}
|
||||
|
||||
if (disableBigFonts)
|
||||
{
|
||||
// If a plugin has requested a font size that is bigger than current restrictions, load it scaled down.
|
||||
// After loading glyphs onto font atlas, font information will be modified to make it look like the font of original size has been loaded.
|
||||
if (config.SizePixels > MinimumFallbackFontSizePx)
|
||||
config.SizePixels = MinimumFallbackFontSizePx;
|
||||
}
|
||||
else
|
||||
{
|
||||
config.SizePixels = config.SizePixels * io.FontGlobalScale;
|
||||
}
|
||||
config.SizePixels = config.SizePixels * io.FontGlobalScale;
|
||||
}
|
||||
|
||||
for (int i = 0, i_ = ioFonts.ConfigData.Size; i < i_; i++)
|
||||
{
|
||||
var config = ioFonts.ConfigData[i];
|
||||
config.RasterizerGamma = config.RasterizerGamma * fontGamma;
|
||||
}
|
||||
|
||||
Log.Verbose("[FONT] ImGui.IO.Build will be called.");
|
||||
|
|
@ -862,42 +820,6 @@ namespace Dalamud.Interface.Internal
|
|||
gameFontManager.AfterIoFontsBuild();
|
||||
Log.Verbose("[FONT] ImGui.IO.Build OK!");
|
||||
|
||||
if (ioFonts.TexHeight > maxTexDimension)
|
||||
{
|
||||
var possibilityForScaling = false;
|
||||
foreach (var x in this.loadedFontInfo.Values)
|
||||
{
|
||||
if (x.TargetSizePx * x.Scale > MinimumFallbackFontSizePx)
|
||||
{
|
||||
possibilityForScaling = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (possibilityForScaling && !disableBigFonts)
|
||||
{
|
||||
Log.Information("[FONT] Atlas size is {0}x{1} which is bigger than allowed {2}x{3}. Retrying with minimized font sizes.", ioFonts.TexWidth, ioFonts.TexHeight, maxTexDimension, maxTexDimension);
|
||||
this.IsFallbackFontMode = true;
|
||||
this.SetupFonts(true);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Warning("[FONT] Atlas size is {0}x{1} which is bigger than allowed {2}x{3} even when font sizes are minimized up to {4}px. This may result in crash.", ioFonts.TexWidth, ioFonts.TexHeight, maxTexDimension, maxTexDimension, MinimumFallbackFontSizePx);
|
||||
}
|
||||
}
|
||||
|
||||
if (!disableBigFonts)
|
||||
this.IsFallbackFontMode = false;
|
||||
|
||||
if (Math.Abs(fontGamma - 1.0f) >= 0.001)
|
||||
{
|
||||
// Gamma correction (stbtt/FreeType would output in linear space whereas most real world usages will apply 1.4 or 1.8 gamma; Windows/XIV prebaked uses 1.4)
|
||||
ioFonts.GetTexDataAsRGBA32(out byte* texPixels, out var texWidth, out var texHeight);
|
||||
for (int i = 3, i_ = texWidth * texHeight * 4; i < i_; i += 4)
|
||||
texPixels[i] = (byte)(Math.Pow(texPixels[i] / 255.0f, 1.0f / fontGamma) * 255.0f);
|
||||
}
|
||||
|
||||
gameFontManager.AfterBuildFonts();
|
||||
|
||||
foreach (var (font, mod) in this.loadedFontInfo)
|
||||
|
|
@ -1015,34 +937,7 @@ namespace Dalamud.Interface.Internal
|
|||
this.scene!.OnNewRenderFrame -= this.RebuildFontsInternal;
|
||||
|
||||
Log.Verbose("[FONT] Calling InvalidateFonts");
|
||||
try
|
||||
{
|
||||
this.scene.InvalidateFonts();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (this.FontResolutionLevel > 2)
|
||||
{
|
||||
Log.Error(ex, "[FONT] Failed to create font textures; setting font resolution level to 2 and retrying");
|
||||
this.FontResolutionLevelOverride = 2;
|
||||
this.SetupFonts();
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Error(ex, "[FONT] Failed to create font textures; forcing fallback font mode");
|
||||
this.SetupFonts(true);
|
||||
}
|
||||
|
||||
Log.Verbose("[FONT] Calling InvalidateFonts again");
|
||||
try
|
||||
{
|
||||
this.scene.InvalidateFonts();
|
||||
}
|
||||
catch (Exception ex2)
|
||||
{
|
||||
Log.Error(ex2, "[FONT] Giving up");
|
||||
}
|
||||
}
|
||||
this.scene.InvalidateFonts();
|
||||
|
||||
Log.Verbose("[FONT] Font Rebuild OK!");
|
||||
|
||||
|
|
@ -1290,13 +1185,12 @@ namespace Dalamud.Interface.Internal
|
|||
/// <param name="axis">Whether and how to use AXIS fonts.</param>
|
||||
/// <param name="sizePx">Target font size in pixels, which will not be considered for further scaling.</param>
|
||||
/// <param name="globalFontScale">Font scale to be referred for loading AXIS font of appropriate size.</param>
|
||||
/// <param name="disableBigFonts">Whether to enable loading big AXIS fonts.</param>
|
||||
internal TargetFontModification(string name, AxisMode axis, float sizePx, float globalFontScale, bool disableBigFonts)
|
||||
internal TargetFontModification(string name, AxisMode axis, float sizePx, float globalFontScale)
|
||||
{
|
||||
this.Name = name;
|
||||
this.Axis = axis;
|
||||
this.TargetSizePx = sizePx;
|
||||
this.Scale = disableBigFonts ? MinimumFallbackFontSizePx / sizePx : globalFontScale;
|
||||
this.Scale = globalFontScale;
|
||||
this.SourceAxis = Service<GameFontManager>.Get().NewFontRef(new(GameFontFamily.Axis, this.TargetSizePx * this.Scale));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ namespace Dalamud.Interface.Internal
|
|||
ImGui.Text(isVisible ? "Visible" : "Not Visible");
|
||||
ImGui.PopStyleColor();
|
||||
|
||||
ImGui.SameLine(ImGui.GetWindowContentRegionWidth() - 25);
|
||||
ImGui.SameLine(ImGui.GetWindowContentRegionMax().X - ImGui.GetWindowContentRegionMin().X - 25);
|
||||
if (ImGui.SmallButton("V"))
|
||||
{
|
||||
atkUnitBase->Flags ^= 0x20;
|
||||
|
|
|
|||
144
Dalamud/Interface/Internal/Windows/BranchSwitcherWindow.cs
Normal file
144
Dalamud/Interface/Internal/Windows/BranchSwitcherWindow.cs
Normal file
|
|
@ -0,0 +1,144 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Json;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Dalamud.Configuration.Internal;
|
||||
using Dalamud.Interface.Colors;
|
||||
using Dalamud.Interface.Windowing;
|
||||
using ImGuiNET;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Dalamud.Interface.Internal.Windows;
|
||||
|
||||
/// <summary>
|
||||
/// Window responsible for switching Dalamud beta branches.
|
||||
/// </summary>
|
||||
public class BranchSwitcherWindow : Window
|
||||
{
|
||||
private const string BranchInfoUrl = "https://kamori.goats.dev/Dalamud/Release/Meta";
|
||||
|
||||
private Dictionary<string, VersionEntry>? branches;
|
||||
private int selectedBranchIndex;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="BranchSwitcherWindow"/> class.
|
||||
/// </summary>
|
||||
public BranchSwitcherWindow()
|
||||
: base("Branch Switcher", ImGuiWindowFlags.AlwaysAutoResize)
|
||||
{
|
||||
this.ShowCloseButton = false;
|
||||
this.RespectCloseHotkey = false;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void OnOpen()
|
||||
{
|
||||
Task.Run(async () =>
|
||||
{
|
||||
using var client = new HttpClient();
|
||||
this.branches = await client.GetFromJsonAsync<Dictionary<string, VersionEntry>>(BranchInfoUrl);
|
||||
Debug.Assert(this.branches != null, "this.branches != null");
|
||||
|
||||
var config = Service<DalamudConfiguration>.Get();
|
||||
this.selectedBranchIndex = this.branches!.Any(x => x.Key == config.DalamudBetaKind) ?
|
||||
this.branches.TakeWhile(x => x.Key != config.DalamudBetaKind).Count()
|
||||
: 0;
|
||||
|
||||
if (this.branches.ElementAt(this.selectedBranchIndex).Value.Key != config.DalamudBetaKey)
|
||||
this.selectedBranchIndex = 0;
|
||||
});
|
||||
|
||||
base.OnOpen();
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void Draw()
|
||||
{
|
||||
if (this.branches == null)
|
||||
{
|
||||
ImGui.TextColored(ImGuiColors.DalamudGrey, "Loading branches...");
|
||||
return;
|
||||
}
|
||||
|
||||
var si = Service<DalamudStartInfo>.Get();
|
||||
|
||||
var itemsArray = this.branches.Select(x => x.Key).ToArray();
|
||||
ImGui.ListBox("Branch", ref this.selectedBranchIndex, itemsArray, itemsArray.Length);
|
||||
|
||||
var pickedBranch = this.branches.ElementAt(this.selectedBranchIndex);
|
||||
|
||||
if (pickedBranch.Value.SupportedGameVer != si.GameVersion)
|
||||
{
|
||||
ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudRed);
|
||||
ImGui.TextWrapped("Can't pick this branch. GameVer != SupportedGameVer.");
|
||||
}
|
||||
else
|
||||
{
|
||||
ImGui.Text($"Version: {pickedBranch.Value.AssemblyVersion} ({pickedBranch.Value.GitSha ?? "unk"})");
|
||||
ImGui.Text($"Runtime: {pickedBranch.Value.RuntimeVersion}");
|
||||
|
||||
ImGuiHelpers.ScaledDummy(5);
|
||||
|
||||
void Pick()
|
||||
{
|
||||
var config = Service<DalamudConfiguration>.Get();
|
||||
config.DalamudBetaKind = pickedBranch.Key;
|
||||
config.DalamudBetaKey = pickedBranch.Value.Key;
|
||||
config.Save();
|
||||
}
|
||||
|
||||
if (ImGui.Button("Pick"))
|
||||
{
|
||||
Pick();
|
||||
}
|
||||
|
||||
ImGui.SameLine();
|
||||
|
||||
if (ImGui.Button("Pick & Restart"))
|
||||
{
|
||||
Pick();
|
||||
|
||||
var appData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
|
||||
var xlPath = Path.Combine(appData, "XIVLauncher", "XIVLauncher.exe");
|
||||
|
||||
if (File.Exists(xlPath))
|
||||
{
|
||||
Process.Start(xlPath);
|
||||
Environment.Exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class VersionEntry
|
||||
{
|
||||
[JsonProperty("key")]
|
||||
public string? Key { get; set; }
|
||||
|
||||
[JsonProperty("track")]
|
||||
public string? Track { get; set; }
|
||||
|
||||
[JsonProperty("assemblyVersion")]
|
||||
public string? AssemblyVersion { get; set; }
|
||||
|
||||
[JsonProperty("runtimeVersion")]
|
||||
public string? RuntimeVersion { get; set; }
|
||||
|
||||
[JsonProperty("runtimeRequired")]
|
||||
public bool RuntimeRequired { get; set; }
|
||||
|
||||
[JsonProperty("supportedGameVer")]
|
||||
public string? SupportedGameVer { get; set; }
|
||||
|
||||
[JsonProperty("downloadUrl")]
|
||||
public string? DownloadUrl { get; set; }
|
||||
|
||||
[JsonProperty("gitSha")]
|
||||
public string? GitSha { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
using System;
|
||||
using System.Numerics;
|
||||
|
||||
using CheapLoc;
|
||||
using Dalamud.Configuration.Internal;
|
||||
using Dalamud.Interface.Windowing;
|
||||
using ImGuiNET;
|
||||
using Serilog;
|
||||
|
||||
namespace Dalamud.Interface.Internal.Windows
|
||||
{
|
||||
/// <summary>
|
||||
/// For major updates, an in-game Changelog window.
|
||||
/// </summary>
|
||||
internal sealed class FallbackFontNoticeWindow : Window, IDisposable
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="FallbackFontNoticeWindow"/> class.
|
||||
/// </summary>
|
||||
public FallbackFontNoticeWindow()
|
||||
: base(Title, ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoFocusOnAppearing | ImGuiWindowFlags.NoNavFocus)
|
||||
{
|
||||
this.Namespace = "FallbackFontNoticeWindow";
|
||||
this.RespectCloseHotkey = false;
|
||||
|
||||
this.Size = new Vector2(885, 463);
|
||||
this.SizeCondition = ImGuiCond.Appearing;
|
||||
|
||||
var interfaceManager = Service<InterfaceManager>.Get();
|
||||
var dalamud = Service<Dalamud>.Get();
|
||||
|
||||
Service<InterfaceManager>.Get().FallbackFontModeChange += this.OnFallbackFontModeChange;
|
||||
}
|
||||
|
||||
private static string Title => Loc.Localize("FallbackFontNoticeWindowTitle", "Fallback Font Mode Active");
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void Draw()
|
||||
{
|
||||
ImGui.Text(Title);
|
||||
ImGuiHelpers.ScaledDummy(10);
|
||||
|
||||
ImGui.Text(Loc.Localize("FallbackFontNoticeWindowBody", "The text used by Dalamud and plugins has been made blurry in order to prevent possible crash."));
|
||||
ImGuiHelpers.ScaledDummy(10);
|
||||
|
||||
ImGui.Text(Loc.Localize("FallbackFontNoticeWindowSolution1", "* You may attempt to increase the limits on text quality. This may result in a crash."));
|
||||
ImGuiHelpers.ScaledDummy(10);
|
||||
ImGui.SameLine();
|
||||
if (ImGui.Button(Loc.Localize("FallbackFontNoticeWindowOpenDalamudSettings", "Open Dalamud Settings")))
|
||||
Service<DalamudInterface>.Get().OpenSettings();
|
||||
ImGuiHelpers.ScaledDummy(10);
|
||||
ImGui.SameLine();
|
||||
ImGui.Text(string.Format(
|
||||
Loc.Localize(
|
||||
"FallbackFontNoticeWindowSolution1Instructions",
|
||||
"In \"{0}\" tab, choose a better option for \"{1}\"."),
|
||||
Loc.Localize("DalamudSettingsVisual", "Look & Feel"),
|
||||
Loc.Localize("DalamudSettingsFontResolutionLevel", "Font resolution level")));
|
||||
|
||||
ImGuiHelpers.ScaledDummy(10);
|
||||
|
||||
ImGui.Text(Loc.Localize("FallbackFontNoticeWindowSolution2", "* You may disable custom fonts, or make fonts smaller, from individual plugin settings."));
|
||||
ImGuiHelpers.ScaledDummy(10);
|
||||
ImGui.SameLine();
|
||||
if (ImGui.Button(Loc.Localize("FallbackFontNoticeWindowOpenDalamudPlugins", "Open Plugin Installer")))
|
||||
Service<DalamudInterface>.Get().OpenPluginInstaller();
|
||||
|
||||
ImGuiHelpers.ScaledDummy(10);
|
||||
|
||||
if (ImGui.Button(Loc.Localize("FallbackFontNoticeWindowDoNotShowAgain", "Do not show again")))
|
||||
{
|
||||
this.IsOpen = false;
|
||||
Service<DalamudConfiguration>.Get().DisableFontFallbackNotice = true;
|
||||
Service<DalamudConfiguration>.Get().Save();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Dispose this window.
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
Service<InterfaceManager>.Get().FallbackFontModeChange -= this.OnFallbackFontModeChange;
|
||||
}
|
||||
|
||||
private void OnFallbackFontModeChange(bool mode)
|
||||
{
|
||||
Log.Verbose("[{0}] OnFallbackFontModeChange called: {1} (disable={2})", this.Namespace, mode, Service<DalamudConfiguration>.Get().DisableFontFallbackNotice);
|
||||
if (!mode)
|
||||
this.IsOpen = false;
|
||||
else if (!Service<DalamudConfiguration>.Get().DisableFontFallbackNotice)
|
||||
this.IsOpen = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
using System;
|
||||
|
||||
using Dalamud.Plugin.Internal;
|
||||
using Dalamud.Plugin.Internal.Types;
|
||||
using Dalamud.Utility;
|
||||
|
||||
|
|
|
|||
|
|
@ -1180,6 +1180,12 @@ namespace Dalamud.Interface.Internal.Windows.PluginInstaller
|
|||
|
||||
ImGui.PopStyleColor();
|
||||
}
|
||||
else if (plugin is { IsOrphaned: true })
|
||||
{
|
||||
ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudRed);
|
||||
ImGui.TextWrapped(Locs.PluginBody_Orphaned);
|
||||
ImGui.PopStyleColor();
|
||||
}
|
||||
else if (plugin is { State: PluginState.LoadError or PluginState.DependencyResolutionFailed }) // Load failed warning
|
||||
{
|
||||
ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudRed);
|
||||
|
|
@ -1517,6 +1523,13 @@ namespace Dalamud.Interface.Internal.Windows.PluginInstaller
|
|||
trouble = true;
|
||||
}
|
||||
|
||||
// Orphaned
|
||||
if (plugin.IsOrphaned)
|
||||
{
|
||||
label += Locs.PluginTitleMod_OrphanedError;
|
||||
trouble = true;
|
||||
}
|
||||
|
||||
ImGui.PushID($"installed{index}{plugin.Manifest.InternalName}");
|
||||
var hasChangelog = !plugin.Manifest.Changelog.IsNullOrEmpty();
|
||||
|
||||
|
|
@ -1691,6 +1704,9 @@ namespace Dalamud.Interface.Internal.Windows.PluginInstaller
|
|||
// Disable everything if the plugin is outdated
|
||||
disabled = disabled || (plugin.IsOutdated && !configuration.LoadAllApiLevels) || plugin.IsBanned;
|
||||
|
||||
// Disable everything if the plugin is orphaned
|
||||
disabled = disabled || plugin.IsOrphaned;
|
||||
|
||||
// Disable everything if the plugin failed to load
|
||||
disabled = disabled || plugin.State == PluginState.LoadError || plugin.State == PluginState.DependencyResolutionFailed;
|
||||
|
||||
|
|
@ -1904,7 +1920,7 @@ namespace Dalamud.Interface.Internal.Windows.PluginInstaller
|
|||
private void DrawDeletePluginButton(LocalPlugin plugin)
|
||||
{
|
||||
var unloaded = plugin.State == PluginState.Unloaded;
|
||||
var showButton = unloaded && (plugin.IsDev || plugin.IsOutdated || plugin.IsBanned);
|
||||
var showButton = unloaded && (plugin.IsDev || plugin.IsOutdated || plugin.IsBanned || plugin.IsOrphaned);
|
||||
|
||||
if (!showButton)
|
||||
return;
|
||||
|
|
@ -2265,6 +2281,8 @@ namespace Dalamud.Interface.Internal.Windows.PluginInstaller
|
|||
|
||||
public static string PluginTitleMod_BannedError => Loc.Localize("InstallerBannedError", " (automatically disabled)");
|
||||
|
||||
public static string PluginTitleMod_OrphanedError => Loc.Localize("InstallerOrphanedError", " (unknown repository)");
|
||||
|
||||
public static string PluginTitleMod_New => Loc.Localize("InstallerNewPlugin ", " New!");
|
||||
|
||||
#endregion
|
||||
|
|
@ -2299,6 +2317,8 @@ namespace Dalamud.Interface.Internal.Windows.PluginInstaller
|
|||
|
||||
public static string PluginBody_Outdated => Loc.Localize("InstallerOutdatedPluginBody ", "This plugin is outdated and incompatible at the moment. Please wait for it to be updated by its author.");
|
||||
|
||||
public static string PluginBody_Orphaned => Loc.Localize("InstallerOrphanedPluginBody ", "This plugin's source repository is no longer available. You may need to reinstall it from its repository, or re-add the repository.");
|
||||
|
||||
public static string PluginBody_LoadFailed => Loc.Localize("InstallerLoadFailedPluginBody ", "This plugin failed to load. Please contact the author for more information.");
|
||||
|
||||
public static string PluginBody_Banned => Loc.Localize("InstallerBannedPluginBody ", "This plugin was automatically disabled due to incompatibilities and is not available at the moment. Please wait for it to be updated by its author.");
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
|
||||
ImGui.Columns(4);
|
||||
|
||||
ImGui.SetColumnWidth(0, ImGui.GetWindowContentRegionWidth() - 300);
|
||||
ImGui.SetColumnWidth(0, ImGui.GetWindowContentRegionMax().X - ImGui.GetWindowContentRegionMin().X - 300);
|
||||
ImGui.SetColumnWidth(1, 100f);
|
||||
ImGui.SetColumnWidth(2, 100f);
|
||||
ImGui.SetColumnWidth(3, 100f);
|
||||
|
|
@ -179,7 +179,7 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
{
|
||||
ImGui.Columns(4);
|
||||
|
||||
ImGui.SetColumnWidth(0, ImGui.GetWindowContentRegionWidth() - 330);
|
||||
ImGui.SetColumnWidth(0, ImGui.GetWindowContentRegionMax().X - ImGui.GetWindowContentRegionMin().X - 330);
|
||||
ImGui.SetColumnWidth(1, 180f);
|
||||
ImGui.SetColumnWidth(2, 100f);
|
||||
ImGui.SetColumnWidth(3, 100f);
|
||||
|
|
|
|||
|
|
@ -27,8 +27,6 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
private readonly string[] languages;
|
||||
private readonly string[] locLanguages;
|
||||
|
||||
private readonly string[] fontResolutionLevelStrings;
|
||||
|
||||
private int langIndex;
|
||||
|
||||
private XivChatType dalamudMessagesChatType;
|
||||
|
|
@ -38,8 +36,6 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
private bool doCfChatMessage;
|
||||
private bool doMbCollect;
|
||||
|
||||
private int fontResolutionLevel;
|
||||
|
||||
private float globalUiScale;
|
||||
private bool doUseAxisFontsFromGame;
|
||||
private float fontGamma;
|
||||
|
|
@ -101,7 +97,6 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
this.globalUiScale = configuration.GlobalUiScale;
|
||||
this.fontGamma = configuration.FontGammaLevel;
|
||||
this.doUseAxisFontsFromGame = configuration.UseAxisFontsFromGame;
|
||||
this.fontResolutionLevel = configuration.FontResolutionLevel;
|
||||
this.doToggleUiHide = configuration.ToggleUiHide;
|
||||
this.doToggleUiHideDuringCutscenes = configuration.ToggleUiHideDuringCutscenes;
|
||||
this.doToggleUiHideDuringGpose = configuration.ToggleUiHideDuringGpose;
|
||||
|
|
@ -126,15 +121,6 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
this.doButtonsSystemMenu = configuration.DoButtonsSystemMenu;
|
||||
this.disableRmtFiltering = configuration.DisableRmtFiltering;
|
||||
|
||||
this.fontResolutionLevelStrings = new[]
|
||||
{
|
||||
Loc.Localize("DalamudSettingsFontResolutionLevel0", "Least (1k x 1k texture)"),
|
||||
Loc.Localize("DalamudSettingsFontResolutionLevel1", "Lesser (2k x 2k texture)"),
|
||||
Loc.Localize("DalamudSettingsFontResolutionLevel2", "Normal (4k x 4k texture)"),
|
||||
Loc.Localize("DalamudSettingsFontResolutionLevel3", "Better (8k x 8k texture, may crash your game)"),
|
||||
Loc.Localize("DalamudSettingsFontResolutionLevel4", "Best (16k x 16k texture, may crash your game)"),
|
||||
};
|
||||
|
||||
this.languages = Localization.ApplicableLangCodes.Prepend("en").ToArray();
|
||||
this.langIndex = Array.IndexOf(this.languages, configuration.EffectiveLanguage);
|
||||
if (this.langIndex == -1)
|
||||
|
|
@ -184,12 +170,10 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
|
||||
var rebuildFont = ImGui.GetIO().FontGlobalScale != configuration.GlobalUiScale
|
||||
|| interfaceManager.FontGamma != configuration.FontGammaLevel
|
||||
|| interfaceManager.FontResolutionLevel != configuration.FontResolutionLevel
|
||||
|| interfaceManager.UseAxis != configuration.UseAxisFontsFromGame;
|
||||
|
||||
ImGui.GetIO().FontGlobalScale = configuration.GlobalUiScale;
|
||||
interfaceManager.FontGammaOverride = null;
|
||||
interfaceManager.FontResolutionLevelOverride = null;
|
||||
interfaceManager.UseAxisOverride = null;
|
||||
this.thirdRepoList = configuration.ThirdRepoList.Select(x => x.Clone()).ToList();
|
||||
this.devPluginLocations = configuration.DevPluginLoadLocations.Select(x => x.Clone()).ToList();
|
||||
|
|
@ -373,38 +357,6 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
|
||||
ImGui.TextColored(ImGuiColors.DalamudGrey, Loc.Localize("DalamudSettingToggleUiAxisFontsHint", "Use AXIS fonts (the game's main UI fonts) as default Dalamud font."));
|
||||
|
||||
ImGuiHelpers.ScaledDummy(3);
|
||||
|
||||
ImGui.Text(Loc.Localize("DalamudSettingsFontResolutionLevel", "Font resolution level"));
|
||||
if (interfaceManager.FontResolutionLevelOverride != null)
|
||||
this.fontResolutionLevel = interfaceManager.FontResolutionLevelOverride.Value;
|
||||
if (ImGui.Combo("##DalamudSettingsFontResolutionLevelCombo", ref this.fontResolutionLevel, this.fontResolutionLevelStrings, this.fontResolutionLevelStrings.Length))
|
||||
{
|
||||
interfaceManager.FontResolutionLevelOverride = this.fontResolutionLevel;
|
||||
interfaceManager.RebuildFonts();
|
||||
}
|
||||
|
||||
ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudGrey);
|
||||
ImGui.TextWrapped(string.Format(
|
||||
Loc.Localize(
|
||||
"DalamudSettingsFontResolutionLevelHint",
|
||||
"This option allows Dalamud fonts to look better.\n* If your game crashes right away, or the option reverts, when changing this option, your PC does not support high font resolutions in Dalamud - you will have to use a lower one.\n* If it doesn't crash or revert immediately, then you can keep the new choice indefinitely as it's not going to crash your game once it worked.\n* Either choose the 3rd or 5th option. Use other options only when neither works well.\n* Current font atlas size is {0}px * {1}px."),
|
||||
ImGui.GetIO().Fonts.TexWidth,
|
||||
ImGui.GetIO().Fonts.TexHeight));
|
||||
ImGui.PopStyleColor();
|
||||
|
||||
if (Service<DalamudConfiguration>.Get().DisableFontFallbackNotice)
|
||||
{
|
||||
ImGui.Text(Loc.Localize("DalamudSettingsFontResolutionLevelWarningDisabled", "Warning will not be displayed even when the limits are enforced and fonts become blurry."));
|
||||
if (ImGui.Button(Loc.Localize("DalamudSettingsFontResolutionLevelWarningReset", "Show warnings") + "##DalamudSettingsFontResolutionLevelWarningReset"))
|
||||
{
|
||||
Service<DalamudConfiguration>.Get().DisableFontFallbackNotice = false;
|
||||
Service<DalamudConfiguration>.Get().Save();
|
||||
if (Service<InterfaceManager>.Get().IsFallbackFontMode)
|
||||
Service<DalamudInterface>.Get().OpenFallbackFontNoticeWindow();
|
||||
}
|
||||
}
|
||||
|
||||
ImGuiHelpers.ScaledDummy(10);
|
||||
|
||||
ImGui.TextColored(ImGuiColors.DalamudGrey, Loc.Localize("DalamudSettingToggleUiHideOptOutNote", "Plugins may independently opt out of the settings below."));
|
||||
|
|
@ -648,7 +600,7 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
|
||||
ImGui.Columns(4);
|
||||
ImGui.SetColumnWidth(0, 18 + (5 * ImGuiHelpers.GlobalScale));
|
||||
ImGui.SetColumnWidth(1, ImGui.GetWindowContentRegionWidth() - (18 + 16 + 14) - ((5 + 45 + 26) * ImGuiHelpers.GlobalScale));
|
||||
ImGui.SetColumnWidth(1, ImGui.GetWindowContentRegionMax().X - ImGui.GetWindowContentRegionMin().X - (18 + 16 + 14) - ((5 + 45 + 26) * ImGuiHelpers.GlobalScale));
|
||||
ImGui.SetColumnWidth(2, 16 + (45 * ImGuiHelpers.GlobalScale));
|
||||
ImGui.SetColumnWidth(3, 14 + (26 * ImGuiHelpers.GlobalScale));
|
||||
|
||||
|
|
@ -787,7 +739,7 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
|
||||
ImGui.Columns(4);
|
||||
ImGui.SetColumnWidth(0, 18 + (5 * ImGuiHelpers.GlobalScale));
|
||||
ImGui.SetColumnWidth(1, ImGui.GetWindowContentRegionWidth() - (18 + 16 + 14) - ((5 + 45 + 26) * ImGuiHelpers.GlobalScale));
|
||||
ImGui.SetColumnWidth(1, ImGui.GetWindowContentRegionMax().X - ImGui.GetWindowContentRegionMin().X - (18 + 16 + 14) - ((5 + 45 + 26) * ImGuiHelpers.GlobalScale));
|
||||
ImGui.SetColumnWidth(2, 16 + (45 * ImGuiHelpers.GlobalScale));
|
||||
ImGui.SetColumnWidth(3, 14 + (26 * ImGuiHelpers.GlobalScale));
|
||||
|
||||
|
|
@ -969,7 +921,6 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
configuration.ShowTsm = this.doTsm;
|
||||
|
||||
configuration.UseAxisFontsFromGame = this.doUseAxisFontsFromGame;
|
||||
configuration.FontResolutionLevel = this.fontResolutionLevel;
|
||||
configuration.FontGammaLevel = this.fontGamma;
|
||||
|
||||
// This is applied every frame in InterfaceManager::CheckViewportState()
|
||||
|
|
|
|||
|
|
@ -142,7 +142,6 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
}
|
||||
|
||||
if (!ImGui.IsWindowHovered(ImGuiHoveredFlags.RootAndChildWindows |
|
||||
ImGuiHoveredFlags.AllowWhenOverlapped |
|
||||
ImGuiHoveredFlags.AllowWhenBlockedByActiveItem))
|
||||
{
|
||||
this.state = State.FadeOut;
|
||||
|
|
@ -188,7 +187,6 @@ namespace Dalamud.Interface.Internal.Windows
|
|||
ImGui.PopStyleVar();
|
||||
|
||||
var isHover = ImGui.IsWindowHovered(ImGuiHoveredFlags.RootAndChildWindows |
|
||||
ImGuiHoveredFlags.AllowWhenOverlapped |
|
||||
ImGuiHoveredFlags.AllowWhenBlockedByActiveItem);
|
||||
|
||||
if (!isHover && this.fadeOutEasing!.IsDone)
|
||||
|
|
|
|||
|
|
@ -104,6 +104,11 @@ namespace Dalamud.Interface.Windowing
|
|||
/// </summary>
|
||||
public float? BgAlpha { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether or not this ImGui window should display a close button in the title bar.
|
||||
/// </summary>
|
||||
public bool ShowCloseButton { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether or not this window will stay open.
|
||||
/// </summary>
|
||||
|
|
@ -236,7 +241,7 @@ namespace Dalamud.Interface.Windowing
|
|||
ImGui.PushStyleColor(ImGuiCol.TitleBgCollapsed, focusedHeaderColor);
|
||||
}
|
||||
|
||||
if (ImGui.Begin(this.WindowName, ref this.internalIsOpen, this.Flags))
|
||||
if (this.ShowCloseButton ? ImGui.Begin(this.WindowName, ref this.internalIsOpen, this.Flags) : ImGui.Begin(this.WindowName, this.Flags))
|
||||
{
|
||||
// Draw the actual window contents
|
||||
this.Draw();
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@ using System.Linq;
|
|||
using System.Reflection;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Dalamud.Logging.Internal;
|
||||
using Dalamud.Utility.Timing;
|
||||
|
||||
namespace Dalamud.IoC.Internal
|
||||
{
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ using Dalamud.Game.Text.Sanitizer;
|
|||
using Dalamud.Game.Text.SeStringHandling;
|
||||
using Dalamud.Game.Text.SeStringHandling.Payloads;
|
||||
using Dalamud.Interface;
|
||||
using Dalamud.Interface.GameFonts;
|
||||
using Dalamud.Interface.Internal;
|
||||
using Dalamud.Plugin.Internal;
|
||||
using Dalamud.Plugin.Ipc;
|
||||
|
|
|
|||
|
|
@ -658,11 +658,8 @@ internal partial class PluginManager : IDisposable, IServiceType
|
|||
manifest.Testing = true;
|
||||
}
|
||||
|
||||
if (repoManifest.SourceRepo.IsThirdParty)
|
||||
{
|
||||
// Only document the url if it came from a third party repo.
|
||||
manifest.InstalledFromUrl = repoManifest.SourceRepo.PluginMasterUrl;
|
||||
}
|
||||
// Document the url the plugin was installed from
|
||||
manifest.InstalledFromUrl = repoManifest.SourceRepo.PluginMasterUrl;
|
||||
|
||||
manifest.Save(manifestFile);
|
||||
|
||||
|
|
@ -740,9 +737,14 @@ internal partial class PluginManager : IDisposable, IServiceType
|
|||
}
|
||||
else if (plugin.IsOutdated)
|
||||
{
|
||||
// Out of date plugins get added so they can be updated.
|
||||
// Out of date plugins get added, so they can be updated.
|
||||
Log.Information(ex, $"Plugin was outdated, adding anyways: {dllFile.Name}");
|
||||
}
|
||||
else if (plugin.IsOrphaned)
|
||||
{
|
||||
// Orphaned plugins get added, so that users aren't confused.
|
||||
Log.Information(ex, $"Plugin was orphaned, adding anyways: {dllFile.Name}");
|
||||
}
|
||||
else if (isBoot)
|
||||
{
|
||||
// During boot load, plugins always get added to the list so they can be fiddled with in the UI
|
||||
|
|
|
|||
|
|
@ -209,6 +209,12 @@ internal class LocalPlugin : IDisposable
|
|||
/// </summary>
|
||||
public bool IsTesting => this.Manifest.IsTestingExclusive || this.Manifest.Testing;
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether or not this plugin is orphaned(belongs to a repo) or not.
|
||||
/// </summary>
|
||||
public bool IsOrphaned => !this.IsDev && !this.Manifest.InstalledFromUrl.IsNullOrEmpty() &&
|
||||
Service<PluginManager>.Get().Repos.All(x => x.PluginMasterUrl != this.Manifest.InstalledFromUrl);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether this plugin has been banned.
|
||||
/// </summary>
|
||||
|
|
@ -302,6 +308,9 @@ internal class LocalPlugin : IDisposable
|
|||
if (this.Manifest.Disabled)
|
||||
throw new InvalidPluginOperationException($"Unable to load {this.Name}, disabled");
|
||||
|
||||
if (this.IsOrphaned)
|
||||
throw new InvalidPluginOperationException($"Plugin {this.Name} had no associated repo.");
|
||||
|
||||
this.State = PluginState.Loading;
|
||||
Log.Information($"Loading {this.DllFile.Name}");
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
using System.IO;
|
||||
|
||||
using Dalamud.Utility;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Dalamud.Plugin.Internal.Types;
|
||||
|
|
@ -33,7 +34,7 @@ internal record LocalPluginManifest : PluginManifest
|
|||
/// Gets a value indicating whether this manifest is associated with a plugin that was installed from a third party
|
||||
/// repo. Unless the manifest has been manually modified, this is determined by the InstalledFromUrl being null.
|
||||
/// </summary>
|
||||
public bool IsThirdParty => !string.IsNullOrEmpty(this.InstalledFromUrl);
|
||||
public bool IsThirdParty => !this.InstalledFromUrl.IsNullOrEmpty() && this.InstalledFromUrl != PluginRepository.MainRepoUrl;
|
||||
|
||||
/// <summary>
|
||||
/// Save a plugin manifest to file.
|
||||
|
|
|
|||
|
|
@ -15,7 +15,10 @@ namespace Dalamud.Plugin.Internal.Types;
|
|||
/// </summary>
|
||||
internal class PluginRepository
|
||||
{
|
||||
private const string DalamudPluginsMasterUrl = "https://kamori.goats.dev/Plugin/PluginMaster";
|
||||
/// <summary>
|
||||
/// The URL of the official main repository.
|
||||
/// </summary>
|
||||
public const string MainRepoUrl = "https://kamori.goats.dev/Plugin/PluginMaster";
|
||||
|
||||
private static readonly ModuleLog Log = new("PLUGINR");
|
||||
|
||||
|
|
@ -38,14 +41,14 @@ internal class PluginRepository
|
|||
public PluginRepository(string pluginMasterUrl, bool isEnabled)
|
||||
{
|
||||
this.PluginMasterUrl = pluginMasterUrl;
|
||||
this.IsThirdParty = pluginMasterUrl != DalamudPluginsMasterUrl;
|
||||
this.IsThirdParty = pluginMasterUrl != MainRepoUrl;
|
||||
this.IsEnabled = isEnabled;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a new instance of the <see cref="PluginRepository"/> class for the main repo.
|
||||
/// </summary>
|
||||
public static PluginRepository MainRepo => new(DalamudPluginsMasterUrl, true);
|
||||
public static PluginRepository MainRepo => new(MainRepoUrl, true);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the pluginmaster.json URL.
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 5da5fb742375aba55026f3beeef05dfe876a21bd
|
||||
Subproject commit acc1f99285de7db31055211e4dfcfae648d6c219
|
||||
Loading…
Add table
Add a link
Reference in a new issue