refactor: Moved over to more flexible font loader
This commit is contained in:
parent
f6d4d5ab22
commit
c02c27b63d
@ -3,6 +3,7 @@
|
|||||||
#include <hex.hpp>
|
#include <hex.hpp>
|
||||||
|
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <span>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
@ -601,6 +602,29 @@ namespace hex {
|
|||||||
void registerHandler(const std::string &eventName, const impl::MessagingHandler &handler);
|
void registerHandler(const std::string &eventName, const impl::MessagingHandler &handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace Fonts {
|
||||||
|
|
||||||
|
struct GlyphRange { u16 begin, end; };
|
||||||
|
struct Offset { float x, y; };
|
||||||
|
|
||||||
|
struct Font {
|
||||||
|
std::string name;
|
||||||
|
std::vector<u8> fontData;
|
||||||
|
std::vector<GlyphRange> glyphRanges;
|
||||||
|
Offset offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
std::vector<Font>& getFonts();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadFont(const std::fs::path &path, const std::vector<GlyphRange> &glyphRanges = {}, Offset offset = {});
|
||||||
|
void loadFont(const std::string &name, const std::span<const u8> &data, const std::vector<GlyphRange> &glyphRanges = {}, Offset offset = {});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -751,4 +751,41 @@ namespace hex {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace ImHexApi::Fonts {
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
std::vector<Font>& getFonts() {
|
||||||
|
static std::vector<Font> fonts;
|
||||||
|
|
||||||
|
return fonts;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadFont(const std::fs::path &path, const std::vector<GlyphRange> &glyphRanges, Offset offset) {
|
||||||
|
wolv::io::File fontFile(path, wolv::io::File::Mode::Read);
|
||||||
|
if (!fontFile.isValid()) {
|
||||||
|
log::error("Failed to load font from file '{}'", wolv::util::toUTF8String(path));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl::getFonts().emplace_back(Font {
|
||||||
|
wolv::util::toUTF8String(path.filename()),
|
||||||
|
fontFile.readVector(),
|
||||||
|
glyphRanges,
|
||||||
|
offset
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadFont(const std::string &name, const std::span<const u8> &data, const std::vector<GlyphRange> &glyphRanges, Offset offset) {
|
||||||
|
impl::getFonts().emplace_back(Font {
|
||||||
|
name,
|
||||||
|
{ data.begin(), data.end() },
|
||||||
|
glyphRanges,
|
||||||
|
offset
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
13
lib/third_party/imgui/fonts/CMakeLists.txt
vendored
13
lib/third_party/imgui/fonts/CMakeLists.txt
vendored
@ -6,15 +6,8 @@ project(imgui_fonts)
|
|||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
|
||||||
add_library(imgui_fonts OBJECT
|
add_library(imgui_fonts INTERFACE)
|
||||||
source/unifont_font.c
|
|
||||||
source/codicons_font.c
|
|
||||||
source/fontawesome_font.c
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(imgui_fonts PUBLIC
|
target_include_directories(imgui_fonts INTERFACE
|
||||||
include
|
include
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(imgui_fonts PRIVATE imgui_includes)
|
|
||||||
set_property(TARGET imgui_fonts PROPERTY POSITION_INDEPENDENT_CODE ON)
|
|
1095
lib/third_party/imgui/fonts/source/codicons_font.c
vendored
1095
lib/third_party/imgui/fonts/source/codicons_font.c
vendored
File diff suppressed because it is too large
Load Diff
3025
lib/third_party/imgui/fonts/source/fontawesome_font.c
vendored
3025
lib/third_party/imgui/fonts/source/fontawesome_font.c
vendored
File diff suppressed because it is too large
Load Diff
116170
lib/third_party/imgui/fonts/source/unifont_font.c
vendored
116170
lib/third_party/imgui/fonts/source/unifont_font.c
vendored
File diff suppressed because it is too large
Load Diff
@ -21,9 +21,6 @@
|
|||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
#include <opengl_support.h>
|
#include <opengl_support.h>
|
||||||
|
|
||||||
#include <fonts/fontawesome_font.h>
|
|
||||||
|
|
||||||
|
|
||||||
#include <wolv/utils/guards.hpp>
|
#include <wolv/utils/guards.hpp>
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -53,7 +50,7 @@ namespace hex::init {
|
|||||||
ImHexApi::System::impl::setGPUVendor(reinterpret_cast<const char *>(glGetString(GL_VENDOR)));
|
ImHexApi::System::impl::setGPUVendor(reinterpret_cast<const char *>(glGetString(GL_VENDOR)));
|
||||||
|
|
||||||
EventManager::subscribe<RequestAddInitTask>([this](const std::string& name, bool async, const TaskFunction &function){
|
EventManager::subscribe<RequestAddInitTask>([this](const std::string& name, bool async, const TaskFunction &function){
|
||||||
this->createTask(Task { name, function, async });
|
this->m_tasks.push_back(Task{ name, function, async });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,10 +145,9 @@ namespace hex::init {
|
|||||||
auto startTime = std::chrono::high_resolution_clock::now();
|
auto startTime = std::chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
// Loop over all registered init tasks
|
// Loop over all registered init tasks
|
||||||
for (const auto &task : this->m_tasks) {
|
for (auto it = this->m_tasks.begin(); it != this->m_tasks.end(); ++it) {
|
||||||
|
|
||||||
// Construct a new task callback
|
// Construct a new task callback
|
||||||
this->createTask(task);
|
this->createTask(*it);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check every 100ms if all tasks have run
|
// Check every 100ms if all tasks have run
|
||||||
@ -261,7 +257,7 @@ namespace hex::init {
|
|||||||
// Draw version information
|
// Draw version information
|
||||||
// In debug builds, also display the current commit hash and branch
|
// In debug builds, also display the current commit hash and branch
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
const static auto VersionInfo = hex::format("{0} : {1} {2}@{3}", ImHexApi::System::getImHexVersion(), ICON_FA_CODE_BRANCH, ImHexApi::System::getCommitBranch(), ImHexApi::System::getCommitHash());
|
const static auto VersionInfo = hex::format("{0} : {1}@{2}", ImHexApi::System::getImHexVersion(), ImHexApi::System::getCommitBranch(), ImHexApi::System::getCommitHash());
|
||||||
#else
|
#else
|
||||||
const static auto VersionInfo = hex::format("{0}", ImHexApi::System::getImHexVersion());
|
const static auto VersionInfo = hex::format("{0}", ImHexApi::System::getImHexVersion());
|
||||||
#endif
|
#endif
|
||||||
@ -425,14 +421,8 @@ namespace hex::init {
|
|||||||
cfg.SizePixels = 13.0_scaled;
|
cfg.SizePixels = 13.0_scaled;
|
||||||
io.Fonts->AddFontDefault(&cfg);
|
io.Fonts->AddFontDefault(&cfg);
|
||||||
|
|
||||||
cfg.MergeMode = true;
|
|
||||||
|
|
||||||
ImWchar fontAwesomeRange[] = {
|
|
||||||
ICON_MIN_FA, ICON_MAX_FA, 0
|
|
||||||
};
|
|
||||||
std::uint8_t *px;
|
std::uint8_t *px;
|
||||||
int w, h;
|
int w, h;
|
||||||
io.Fonts->AddFontFromMemoryCompressedTTF(font_awesome_compressed_data, font_awesome_compressed_size, 11.0_scaled, &cfg, fontAwesomeRange);
|
|
||||||
io.Fonts->GetTexDataAsAlpha8(&px, &w, &h);
|
io.Fonts->GetTexDataAsAlpha8(&px, &w, &h);
|
||||||
|
|
||||||
// Create new font atlas
|
// Create new font atlas
|
||||||
|
@ -44,6 +44,7 @@ add_imhex_plugin(
|
|||||||
source/content/file_extraction.cpp
|
source/content/file_extraction.cpp
|
||||||
source/content/report_generators.cpp
|
source/content/report_generators.cpp
|
||||||
source/content/init_tasks.cpp
|
source/content/init_tasks.cpp
|
||||||
|
source/content/fonts.cpp
|
||||||
|
|
||||||
source/content/dpn/basic_nodes.cpp
|
source/content/dpn/basic_nodes.cpp
|
||||||
source/content/dpn/control_nodes.cpp
|
source/content/dpn/control_nodes.cpp
|
||||||
|
0
plugins/builtin/romfs/fonts/asdasd
Normal file
0
plugins/builtin/romfs/fonts/asdasd
Normal file
BIN
plugins/builtin/romfs/fonts/codicons.ttf
Normal file
BIN
plugins/builtin/romfs/fonts/codicons.ttf
Normal file
Binary file not shown.
BIN
plugins/builtin/romfs/fonts/fontawesome.otf
Normal file
BIN
plugins/builtin/romfs/fonts/fontawesome.otf
Normal file
Binary file not shown.
BIN
plugins/builtin/romfs/fonts/unifont.otf
Normal file
BIN
plugins/builtin/romfs/fonts/unifont.otf
Normal file
Binary file not shown.
18
plugins/builtin/source/content/fonts.cpp
Normal file
18
plugins/builtin/source/content/fonts.cpp
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#include <hex/api/imhex_api.hpp>
|
||||||
|
|
||||||
|
#include <romfs/romfs.hpp>
|
||||||
|
|
||||||
|
#include <hex/helpers/utils.hpp>
|
||||||
|
|
||||||
|
#include <fonts/fontawesome_font.h>
|
||||||
|
#include <fonts/codicons_font.h>
|
||||||
|
|
||||||
|
namespace hex::plugin::builtin {
|
||||||
|
|
||||||
|
void loadFonts() {
|
||||||
|
ImHexApi::Fonts::loadFont("Unifont", romfs::get("fonts/unifont.otf").span<u8>());
|
||||||
|
ImHexApi::Fonts::loadFont("VS Codicons", romfs::get("fonts/codicons.ttf").span<u8>(), { { ICON_MIN_VS, ICON_MAX_VS } }, { 0, 3_scaled });
|
||||||
|
ImHexApi::Fonts::loadFont("Font Awesome 5", romfs::get("fonts/fontawesome.otf").span<u8>(), { { ICON_MIN_FA, ICON_MAX_FA } }, { 0, 3_scaled });
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -173,7 +173,7 @@ namespace hex::plugin::builtin {
|
|||||||
fonts->TexDesiredWidth = 4096;
|
fonts->TexDesiredWidth = 4096;
|
||||||
|
|
||||||
// Configure font glyph ranges that should be loaded from the default font and unifont
|
// Configure font glyph ranges that should be loaded from the default font and unifont
|
||||||
static ImVector<ImWchar> ranges;
|
static ImVector<ImWchar> defaultGlyphRanges;
|
||||||
{
|
{
|
||||||
ImFontGlyphRangesBuilder glyphRangesBuilder;
|
ImFontGlyphRangesBuilder glyphRangesBuilder;
|
||||||
|
|
||||||
@ -199,19 +199,9 @@ namespace hex::plugin::builtin {
|
|||||||
glyphRangesBuilder.AddRanges(fonts->GetGlyphRangesVietnamese());
|
glyphRangesBuilder.AddRanges(fonts->GetGlyphRangesVietnamese());
|
||||||
}
|
}
|
||||||
|
|
||||||
glyphRangesBuilder.BuildRanges(&ranges);
|
glyphRangesBuilder.BuildRanges(&defaultGlyphRanges);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Glyph range for font awesome icons
|
|
||||||
constexpr static std::array<ImWchar, 3> fontAwesomeRange = {
|
|
||||||
ICON_MIN_FA, ICON_MAX_FA, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
// Glyph range for codicons icons
|
|
||||||
constexpr static std::array<ImWchar, 3> codiconsRange = {
|
|
||||||
ICON_MIN_VS, ICON_MAX_VS, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
// Load main font
|
// Load main font
|
||||||
// If a custom font has been specified, load it, otherwise load the default ImGui font
|
// If a custom font has been specified, load it, otherwise load the default ImGui font
|
||||||
if (fontFile.empty()) {
|
if (fontFile.empty()) {
|
||||||
@ -225,7 +215,7 @@ namespace hex::plugin::builtin {
|
|||||||
if (!ContentRegistry::Settings::read("hex.builtin.setting.font", "hex.builtin.setting.font.font_antialias", false))
|
if (!ContentRegistry::Settings::read("hex.builtin.setting.font", "hex.builtin.setting.font.font_antialias", false))
|
||||||
cfg.FontBuilderFlags |= ImGuiFreeTypeBuilderFlags_Monochrome | ImGuiFreeTypeBuilderFlags_MonoHinting;
|
cfg.FontBuilderFlags |= ImGuiFreeTypeBuilderFlags_Monochrome | ImGuiFreeTypeBuilderFlags_MonoHinting;
|
||||||
|
|
||||||
auto font = fonts->AddFontFromFileTTF(wolv::util::toUTF8String(fontFile).c_str(), 0, &cfg, ranges.Data);
|
auto font = fonts->AddFontFromFileTTF(wolv::util::toUTF8String(fontFile).c_str(), 0, &cfg, defaultGlyphRanges.Data);
|
||||||
|
|
||||||
cfg.FontBuilderFlags = 0;
|
cfg.FontBuilderFlags = 0;
|
||||||
|
|
||||||
@ -241,15 +231,27 @@ namespace hex::plugin::builtin {
|
|||||||
|
|
||||||
// Merge all fonts into one big font atlas
|
// Merge all fonts into one big font atlas
|
||||||
cfg.MergeMode = true;
|
cfg.MergeMode = true;
|
||||||
|
cfg.FontDataOwnedByAtlas = false;
|
||||||
|
|
||||||
// Add font awesome and codicons icons to font atlas
|
std::list<ImVector<ImWchar>> ranges;
|
||||||
cfg.GlyphOffset = ImVec2(0, 3_scaled);
|
for (auto &font : ImHexApi::Fonts::impl::getFonts()) {
|
||||||
fonts->AddFontFromMemoryCompressedTTF(font_awesome_compressed_data, font_awesome_compressed_size, 0, &cfg, fontAwesomeRange.data());
|
ImVector<ImWchar> fontRange;
|
||||||
fonts->AddFontFromMemoryCompressedTTF(codicons_compressed_data, codicons_compressed_size, 0, &cfg, codiconsRange.data());
|
if (font.glyphRanges.empty()) {
|
||||||
|
fontRange = defaultGlyphRanges;
|
||||||
|
} else {
|
||||||
|
for (const auto &range : font.glyphRanges) {
|
||||||
|
fontRange.push_back(range.begin);
|
||||||
|
fontRange.push_back(range.end);
|
||||||
|
}
|
||||||
|
fontRange.push_back(0x00);
|
||||||
|
}
|
||||||
|
|
||||||
cfg.GlyphOffset = ImVec2(0, 0);
|
ranges.push_back(fontRange);
|
||||||
// Add unifont if unicode support is enabled
|
|
||||||
fonts->AddFontFromMemoryCompressedTTF(unifont_compressed_data, unifont_compressed_size, 0, &cfg, ranges.Data);
|
std::strncpy(cfg.Name, font.name.c_str(), sizeof(cfg.Name));
|
||||||
|
cfg.GlyphOffset = { font.offset.x, font.offset.y };
|
||||||
|
fonts->AddFontFromMemoryTTF(font.fontData.data(), font.fontData.size(), 0, &cfg, ranges.back().Data);
|
||||||
|
}
|
||||||
|
|
||||||
// Try to build the font atlas
|
// Try to build the font atlas
|
||||||
if (!fonts->Build()) {
|
if (!fonts->Build()) {
|
||||||
|
@ -45,6 +45,7 @@ namespace hex::plugin::builtin {
|
|||||||
void addToolbarItems();
|
void addToolbarItems();
|
||||||
void addGlobalUIItems();
|
void addGlobalUIItems();
|
||||||
void addInitTasks();
|
void addInitTasks();
|
||||||
|
void loadFonts();
|
||||||
|
|
||||||
void handleBorderlessWindowMode();
|
void handleBorderlessWindowMode();
|
||||||
|
|
||||||
@ -76,6 +77,7 @@ IMHEX_PLUGIN_SETUP("Built-in", "WerWolv", "Default ImHex functionality") {
|
|||||||
hex::ContentRegistry::Language::addLocalization(nlohmann::json::parse(romfs::get(path).string()));
|
hex::ContentRegistry::Language::addLocalization(nlohmann::json::parse(romfs::get(path).string()));
|
||||||
|
|
||||||
addInitTasks();
|
addInitTasks();
|
||||||
|
loadFonts();
|
||||||
|
|
||||||
registerEventHandlers();
|
registerEventHandlers();
|
||||||
registerDataVisualizers();
|
registerDataVisualizers();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user