[UI] Add JP font loading on linux.
Fixes JP title display in Profile/Show Played Titles
This commit is contained in:
committed by
Radosław Gliński
parent
af7d7fd951
commit
8545fe755e
@@ -30,6 +30,10 @@
|
|||||||
#include <ShlObj_core.h>
|
#include <ShlObj_core.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if XE_PLATFORM_LINUX
|
||||||
|
#include <fontconfig/fontconfig.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
DEFINE_path(
|
DEFINE_path(
|
||||||
custom_font_path, "",
|
custom_font_path, "",
|
||||||
"Allows user to load custom font and use it instead of default one.", "UI");
|
"Allows user to load custom font and use it instead of default one.", "UI");
|
||||||
@@ -356,7 +360,6 @@ bool ImGuiDrawer::LoadWindowsFont(ImGuiIO& io, ImFontConfig& font_config,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ImGuiDrawer::LoadJapaneseFont(ImGuiIO& io, float font_size) {
|
bool ImGuiDrawer::LoadJapaneseFont(ImGuiIO& io, float font_size) {
|
||||||
// TODO(benvanik): jp font on other platforms?
|
|
||||||
#if XE_PLATFORM_WIN32
|
#if XE_PLATFORM_WIN32
|
||||||
PWSTR fonts_dir;
|
PWSTR fonts_dir;
|
||||||
HRESULT result = SHGetKnownFolderPath(FOLDERID_Fonts, 0, NULL, &fonts_dir);
|
HRESULT result = SHGetKnownFolderPath(FOLDERID_Fonts, 0, NULL, &fonts_dir);
|
||||||
@@ -382,6 +385,63 @@ bool ImGuiDrawer::LoadJapaneseFont(ImGuiIO& io, float font_size) {
|
|||||||
CoTaskMemFree(static_cast<void*>(fonts_dir));
|
CoTaskMemFree(static_cast<void*>(fonts_dir));
|
||||||
return true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if XE_PLATFORM_LINUX
|
||||||
|
// On Linux, find and merge CJK font using fontconfig
|
||||||
|
FcConfig* config = FcInitLoadConfigAndFonts();
|
||||||
|
if (!config) {
|
||||||
|
XELOGW(
|
||||||
|
"Unable to initialize fontconfig; CJK characters may not display "
|
||||||
|
"correctly");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a pattern to search for fonts with CJK support
|
||||||
|
FcPattern* pattern = FcPatternCreate();
|
||||||
|
FcCharSet* charset = FcCharSetCreate();
|
||||||
|
FcCharSetAddChar(charset, 0x4E00); // Add a CJK character to the charset
|
||||||
|
FcPatternAddCharSet(pattern, FC_CHARSET, charset);
|
||||||
|
|
||||||
|
// Configure the search
|
||||||
|
FcConfigSubstitute(config, pattern, FcMatchPattern);
|
||||||
|
FcDefaultSubstitute(pattern);
|
||||||
|
|
||||||
|
// Find the best matching font
|
||||||
|
FcResult result;
|
||||||
|
FcPattern* font = FcFontMatch(config, pattern, &result);
|
||||||
|
|
||||||
|
bool success = false;
|
||||||
|
if (font) {
|
||||||
|
FcChar8* file = nullptr;
|
||||||
|
if (FcPatternGetString(font, FC_FILE, 0, &file) == FcResultMatch) {
|
||||||
|
const char* font_path = reinterpret_cast<const char*>(file);
|
||||||
|
|
||||||
|
if (std::filesystem::exists(font_path)) {
|
||||||
|
ImFontConfig jp_font_config;
|
||||||
|
jp_font_config.MergeMode = true;
|
||||||
|
jp_font_config.OversampleH = jp_font_config.OversampleV = 2;
|
||||||
|
jp_font_config.PixelSnapH = true;
|
||||||
|
|
||||||
|
io.Fonts->AddFontFromFileTTF(font_path, font_size, &jp_font_config,
|
||||||
|
io.Fonts->GetGlyphRangesJapanese());
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FcPatternDestroy(font);
|
||||||
|
}
|
||||||
|
|
||||||
|
FcCharSetDestroy(charset);
|
||||||
|
FcPatternDestroy(pattern);
|
||||||
|
FcConfigDestroy(config);
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
XELOGW(
|
||||||
|
"Unable to find CJK font; Japanese characters may not display "
|
||||||
|
"correctly");
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
#endif
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -31,5 +31,6 @@ project("xenia-ui")
|
|||||||
links({
|
links({
|
||||||
"xcb",
|
"xcb",
|
||||||
"X11",
|
"X11",
|
||||||
"X11-xcb"
|
"X11-xcb",
|
||||||
|
"fontconfig"
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user