From 3bfc8311678b5d9b238cf4418a22a04fd1393e4b Mon Sep 17 00:00:00 2001 From: Florian Maunier Date: Thu, 9 Apr 2020 09:23:17 +0200 Subject: [PATCH 1/2] Add GetIcon helper --- Dalamud/Data/DataManager.cs | 51 +++++++++++++++++++ .../LuminaExtensions/LanguageExtensions.cs | 33 ++++++++++++ .../LuminaExtensions/TexFileExtensions.cs | 32 ++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 Dalamud/Data/LuminaExtensions/LanguageExtensions.cs create mode 100644 Dalamud/Data/LuminaExtensions/TexFileExtensions.cs diff --git a/Dalamud/Data/DataManager.cs b/Dalamud/Data/DataManager.cs index 239cfccee..5c5622295 100644 --- a/Dalamud/Data/DataManager.cs +++ b/Dalamud/Data/DataManager.cs @@ -6,7 +6,9 @@ using System.IO; using System.Net; using System.Net.Http; using System.Threading.Tasks; +using Dalamud.Data.LuminaExtensions; using Lumina.Data; +using Lumina.Data.Files; using Lumina.Excel; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -41,6 +43,8 @@ namespace Dalamud.Data private ClientLanguage language; + private const string IconFileFormat = "ui/icon/{0:D3}000/{1}{2:D6}.tex"; + public DataManager(ClientLanguage language) { // Set up default values so plugins do not null-reference when data is being loaded. @@ -131,6 +135,53 @@ namespace Dalamud.Data return this.gameData.Repositories.TryGetValue(filePath.Repository, out repository) ? repository.GetFile(filePath.Category, filePath) : default(T); } + /// + /// Get a containing the icon with the given ID. + /// + /// The icon ID. + /// The containing the icon. + public TexFile GetIcon(int iconId) + { + return GetIcon(string.Empty, iconId); + } + + /// + /// Get a containing the icon with the given ID, of the given language. + /// + /// The requested language. + /// The icon ID. + /// The containing the icon. + public TexFile GetIcon(Language iconLanguage, int iconId) + { + var type = iconLanguage.GetCode(); + if (type.Length > 0) + type += "/"; + return GetIcon(type, iconId); + } + + /// + /// Get a containing the icon with the given ID, of the given type. + /// + /// The type of the icon (e.g. 'hq' to get the HQ variant of an item icon). + /// The icon ID. + /// The containing the icon. + public TexFile GetIcon(string type, int iconId) + { + type ??= string.Empty; + if (type.Length > 0 && !type.EndsWith("/")) + type += "/"; + + var filePath = string.Format(IconFileFormat, iconId / 1000, type, iconId); + var file = this.GetFile(filePath); + + if (file != default(TexFile) || type.Length <= 0) return file; + + // Couldn't get specific type, try for generic version. + filePath = string.Format(IconFileFormat, iconId / 1000, string.Empty, iconId); + file = this.GetFile(filePath); + return file; + } + #endregion } } diff --git a/Dalamud/Data/LuminaExtensions/LanguageExtensions.cs b/Dalamud/Data/LuminaExtensions/LanguageExtensions.cs new file mode 100644 index 000000000..3a4583643 --- /dev/null +++ b/Dalamud/Data/LuminaExtensions/LanguageExtensions.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using Lumina.Data; + +namespace Dalamud.Data.LuminaExtensions +{ + /// + /// Extensions to . + /// + public static class LanguageExtensions + { + private static readonly Dictionary LangToCode = new Dictionary() + { + { Language.None, "" }, + { Language.Japanese, "ja" }, + { Language.English, "en" }, + { Language.German, "de" }, + { Language.French, "fr" }, + { Language.ChineseSimplified, "chs" }, + { Language.ChineseTraditional, "cht" }, + { Language.Korean, "ko" }, + }; + + /// + /// Return the language code for a . + /// + /// The Language. + /// The language code. + public static string GetCode(this Language language) + { + return LangToCode[language]; + } + } +} diff --git a/Dalamud/Data/LuminaExtensions/TexFileExtensions.cs b/Dalamud/Data/LuminaExtensions/TexFileExtensions.cs new file mode 100644 index 000000000..d2bb7b736 --- /dev/null +++ b/Dalamud/Data/LuminaExtensions/TexFileExtensions.cs @@ -0,0 +1,32 @@ +using ImGuiScene; +using Lumina.Data.Files; + +namespace Dalamud.Data.LuminaExtensions +{ + /// + /// Extensions to . + /// + public static class TexFileExtensions + { + /// + /// Returns the image data formatted for . + /// + /// The TexFile to format. + /// The formatted image data. + public static byte[] GetRgbaImageData(this TexFile texFile) + { + var imageData = texFile.ImageData; + var dst = new byte[imageData.Length]; + + for (var i = 0; i < dst.Length; i += 4) + { + dst[i] = imageData[i + 2]; + dst[i + 1] = imageData[i + 1]; + dst[i + 2] = imageData[i]; + dst[i + 3] = imageData[i + 3]; + } + + return dst; + } + } +} From 227400d8214b5f590b04b603ad2dcae55e3e65f6 Mon Sep 17 00:00:00 2001 From: Florian Maunier Date: Thu, 9 Apr 2020 10:50:15 +0200 Subject: [PATCH 2/2] Remove Lumina Language extension, use ClientLanguage instead --- Dalamud/Data/DataManager.cs | 16 ++++++--- .../LuminaExtensions/LanguageExtensions.cs | 33 ------------------- 2 files changed, 11 insertions(+), 38 deletions(-) delete mode 100644 Dalamud/Data/LuminaExtensions/LanguageExtensions.cs diff --git a/Dalamud/Data/DataManager.cs b/Dalamud/Data/DataManager.cs index 5c5622295..edc46ac23 100644 --- a/Dalamud/Data/DataManager.cs +++ b/Dalamud/Data/DataManager.cs @@ -142,7 +142,7 @@ namespace Dalamud.Data /// The containing the icon. public TexFile GetIcon(int iconId) { - return GetIcon(string.Empty, iconId); + return GetIcon(this.language, iconId); } /// @@ -151,11 +151,17 @@ namespace Dalamud.Data /// The requested language. /// The icon ID. /// The containing the icon. - public TexFile GetIcon(Language iconLanguage, int iconId) + public TexFile GetIcon(ClientLanguage iconLanguage, int iconId) { - var type = iconLanguage.GetCode(); - if (type.Length > 0) - type += "/"; + var type = iconLanguage switch { + ClientLanguage.Japanese => "ja/", + ClientLanguage.English => "en/", + ClientLanguage.German => "de/", + ClientLanguage.French => "fr/", + _ => throw new ArgumentOutOfRangeException(nameof(this.language), + "Unknown Language: " + this.language) + }; + return GetIcon(type, iconId); } diff --git a/Dalamud/Data/LuminaExtensions/LanguageExtensions.cs b/Dalamud/Data/LuminaExtensions/LanguageExtensions.cs deleted file mode 100644 index 3a4583643..000000000 --- a/Dalamud/Data/LuminaExtensions/LanguageExtensions.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Collections.Generic; -using Lumina.Data; - -namespace Dalamud.Data.LuminaExtensions -{ - /// - /// Extensions to . - /// - public static class LanguageExtensions - { - private static readonly Dictionary LangToCode = new Dictionary() - { - { Language.None, "" }, - { Language.Japanese, "ja" }, - { Language.English, "en" }, - { Language.German, "de" }, - { Language.French, "fr" }, - { Language.ChineseSimplified, "chs" }, - { Language.ChineseTraditional, "cht" }, - { Language.Korean, "ko" }, - }; - - /// - /// Return the language code for a . - /// - /// The Language. - /// The language code. - public static string GetCode(this Language language) - { - return LangToCode[language]; - } - } -}