mirror of
https://github.com/WerWolv/ImHex.git
synced 2026-03-28 07:47:03 -05:00
impr: Cleanup font loading API, fix CJK glyphs being rendered way too large
This commit is contained in:
@@ -745,16 +745,12 @@ EXPORT_MODULE namespace hex {
|
||||
|
||||
namespace Fonts {
|
||||
|
||||
struct GlyphRange { u16 begin, end; };
|
||||
struct Offset { float x, y; };
|
||||
|
||||
struct MergeFont {
|
||||
std::string name;
|
||||
std::vector<u8> fontData;
|
||||
std::vector<GlyphRange> glyphRanges;
|
||||
Offset offset;
|
||||
u32 flags;
|
||||
std::optional<bool> scalable;
|
||||
std::optional<u32> defaultSize;
|
||||
};
|
||||
|
||||
@@ -777,15 +773,8 @@ EXPORT_MODULE namespace hex {
|
||||
|
||||
}
|
||||
|
||||
GlyphRange glyph(const char *glyph);
|
||||
GlyphRange glyph(u32 codepoint);
|
||||
GlyphRange range(const char *glyphBegin, const char *glyphEnd);
|
||||
GlyphRange range(u32 codepointBegin, u32 codepointEnd);
|
||||
|
||||
void loadFont(const std::fs::path &path, const std::vector<GlyphRange> &glyphRanges = {}, Offset offset = {}, u32 flags = 0, std::optional<bool> scalable = std::nullopt, std::optional<u32> defaultSize = std::nullopt);
|
||||
void loadFont(const std::string &name, const std::span<const u8> &data, const std::vector<GlyphRange> &glyphRanges = {}, Offset offset = {}, u32 flags = 0, std::optional<bool> scalable = std::nullopt, std::optional<u32> defaultSize = std::nullopt);
|
||||
|
||||
constexpr float DefaultFontSize = 13.0;
|
||||
void loadFont(const std::fs::path &path, Offset offset = {}, std::optional<u32> defaultSize = std::nullopt);
|
||||
void loadFont(const std::string &name, const std::span<const u8> &data, Offset offset = {}, std::optional<u32> defaultSize = std::nullopt);
|
||||
|
||||
void registerFont(const UnlocalizedString &fontName);
|
||||
ImFont* getFont(const UnlocalizedString &fontName);
|
||||
|
||||
@@ -1052,41 +1052,7 @@ namespace hex {
|
||||
return getFont(m_fontName);
|
||||
}
|
||||
|
||||
|
||||
GlyphRange glyph(const char *glyph) {
|
||||
u32 codepoint;
|
||||
ImTextCharFromUtf8(&codepoint, glyph, nullptr);
|
||||
|
||||
return {
|
||||
.begin = u16(codepoint),
|
||||
.end = u16(codepoint)
|
||||
};
|
||||
}
|
||||
GlyphRange glyph(u32 codepoint) {
|
||||
return {
|
||||
.begin = u16(codepoint),
|
||||
.end = u16(codepoint)
|
||||
};
|
||||
}
|
||||
GlyphRange range(const char *glyphBegin, const char *glyphEnd) {
|
||||
u32 codepointBegin, codepointEnd;
|
||||
ImTextCharFromUtf8(&codepointBegin, glyphBegin, nullptr);
|
||||
ImTextCharFromUtf8(&codepointEnd, glyphEnd, nullptr);
|
||||
|
||||
return {
|
||||
.begin = u16(codepointBegin),
|
||||
.end = u16(codepointEnd)
|
||||
};
|
||||
}
|
||||
|
||||
GlyphRange range(u32 codepointBegin, u32 codepointEnd) {
|
||||
return {
|
||||
.begin = u16(codepointBegin),
|
||||
.end = u16(codepointEnd)
|
||||
};
|
||||
}
|
||||
|
||||
void loadFont(const std::fs::path &path, const std::vector<GlyphRange> &glyphRanges, Offset offset, u32 flags, std::optional<bool> scalable, std::optional<u32> defaultSize) {
|
||||
void loadFont(const std::fs::path &path, Offset offset, std::optional<u32> defaultSize) {
|
||||
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));
|
||||
@@ -1096,22 +1062,16 @@ namespace hex {
|
||||
impl::s_fonts->emplace_back(MergeFont {
|
||||
wolv::util::toUTF8String(path.filename()),
|
||||
fontFile.readVector(),
|
||||
glyphRanges,
|
||||
offset,
|
||||
flags,
|
||||
scalable,
|
||||
defaultSize
|
||||
});
|
||||
}
|
||||
|
||||
void loadFont(const std::string &name, const std::span<const u8> &data, const std::vector<GlyphRange> &glyphRanges, Offset offset, u32 flags, std::optional<bool> scalable, std::optional<u32> defaultSize) {
|
||||
void loadFont(const std::string &name, const std::span<const u8> &data, Offset offset, std::optional<u32> defaultSize) {
|
||||
impl::s_fonts->emplace_back(MergeFont {
|
||||
name,
|
||||
{ data.begin(), data.end() },
|
||||
glyphRanges,
|
||||
offset,
|
||||
flags,
|
||||
scalable,
|
||||
defaultSize
|
||||
});
|
||||
}
|
||||
|
||||
@@ -528,7 +528,6 @@ namespace hex::init {
|
||||
|
||||
ImFontConfig cfg;
|
||||
cfg.OversampleH = cfg.OversampleV = 1, cfg.PixelSnapH = true;
|
||||
cfg.SizePixels = ImHexApi::Fonts::DefaultFontSize;
|
||||
io.Fonts->AddFontDefault(&cfg);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,8 @@
|
||||
#include <hex/api/imhex_api.hpp>
|
||||
|
||||
#include <fonts/fonts.hpp>
|
||||
|
||||
#include <romfs/romfs.hpp>
|
||||
|
||||
#include <hex/helpers/utils.hpp>
|
||||
|
||||
#include <fonts/vscode_icons.hpp>
|
||||
#include <fonts/blender_icons.hpp>
|
||||
|
||||
namespace hex::fonts {
|
||||
|
||||
static auto s_defaultFont = ImHexApi::Fonts::Font("hex.fonts.font.default");
|
||||
@@ -19,23 +13,9 @@ namespace hex::fonts {
|
||||
const ImHexApi::Fonts::Font& CodeEditor() { return s_codeEditorFont; }
|
||||
|
||||
void registerFonts() {
|
||||
using namespace ImHexApi::Fonts;
|
||||
|
||||
/**
|
||||
* !!IMPORTANT!!
|
||||
* Always load the font files in decreasing size of their glyphs. This will make the rasterize be more
|
||||
* efficient when packing the glyphs into the font atlas and therefor make the atlas much smaller.
|
||||
*/
|
||||
|
||||
ImHexApi::Fonts::loadFont("Blender Icons", romfs::get("fonts/blendericons.ttf").span<u8>(),{ { ICON_MIN_BI, ICON_MAX_BI } }, { -1_scaled, -1_scaled });
|
||||
|
||||
ImHexApi::Fonts::loadFont("VS Codicons", romfs::get("fonts/codicons.ttf").span<u8>(),
|
||||
{
|
||||
{ ICON_MIN_VS, ICON_MAX_VS }
|
||||
},
|
||||
{ 0, -2 });
|
||||
|
||||
ImHexApi::Fonts::loadFont("Unifont", romfs::get("fonts/unifont.otf").span<u8>(), { }, {}, 0, false, 16);
|
||||
ImHexApi::Fonts::loadFont("Blender Icons", romfs::get("fonts/blendericons.ttf").span<u8>(), { -1, -1 });
|
||||
ImHexApi::Fonts::loadFont("VS Codicons", romfs::get("fonts/codicons.ttf").span<u8>(), { 0, -2 });
|
||||
ImHexApi::Fonts::loadFont("Unifont", romfs::get("fonts/unifont.otf").span<u8>(), { 0, 0 }, 10);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -63,7 +63,7 @@ namespace hex::fonts {
|
||||
if (*imguiFont == nullptr) {
|
||||
if (settings.isPixelPerfectFont()) {
|
||||
auto defaultConfig = config;
|
||||
defaultConfig.SizePixels = ImHexApi::Fonts::DefaultFontSize;
|
||||
defaultConfig.SizePixels = 0;
|
||||
*imguiFont = atlas->AddFontDefault(&defaultConfig);
|
||||
} else {
|
||||
static auto jetbrainsFont = romfs::get("fonts/JetBrainsMono.ttf");
|
||||
@@ -81,7 +81,7 @@ namespace hex::fonts {
|
||||
for (auto &extraFont : ImHexApi::Fonts::impl::getMergeFonts()) {
|
||||
config.GlyphOffset = { extraFont.offset.x, -extraFont.offset.y };
|
||||
config.GlyphOffset *= ImHexApi::System::getGlobalScale();
|
||||
atlas->AddFontFromMemoryTTF(const_cast<u8 *>(extraFont.fontData.data()), extraFont.fontData.size(), 0.0F, &config);
|
||||
atlas->AddFontFromMemoryTTF(const_cast<u8 *>(extraFont.fontData.data()), extraFont.fontData.size(), extraFont.defaultSize.value_or(0), &config);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user