From 253c967318e6a75c6c4947b01f12ee3797db1b40 Mon Sep 17 00:00:00 2001 From: Aldrik Ramaekers Date: Sat, 16 Mar 2024 17:30:52 +0100 Subject: load font & ranges based on pc locale --- src/fonts.cpp | 94 ++++++++++++++++++++++++++++++++++++++++++++ src/fonts.h | 15 +++++++ src/windows/main_windows.cpp | 43 ++++++++++++++++++-- 3 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 src/fonts.cpp create mode 100644 src/fonts.h (limited to 'src') diff --git a/src/fonts.cpp b/src/fonts.cpp new file mode 100644 index 0000000..3c1c520 --- /dev/null +++ b/src/fonts.cpp @@ -0,0 +1,94 @@ +#include "fonts.h" +#include "../fonts/SourceSansProRegular.h" +#include "../fonts/GmarketSans.h" +#include "../fonts/NotoSansJP.h" +#include "../fonts/NotoSerifTC.h" +#include "../fonts/NotoSansSC.h" +#include "../fonts/NotoSansThai.h" +#include "imgui.h" + +#include + +void ts_load_fonts(float size, ts_font_range locale) { + ImGuiIO& io = ImGui::GetIO(); + ImFontConfig config; + config.MergeMode = true; + + static const ImWchar arrow_r[] = + { + 0x2192, 0x2193, // → character. + 0, + }; + + static const ImWchar triangles[] = + { + 0x25B6, 0x25BC, // ▶ ▼ characters. + 0, + }; + + // We always use Source Sans Regular for the english, cyrillic and greek alphabet. + // other languages will be displayed in their respective font. + + ImFontGlyphRangesBuilder builder; + ImVector ranges; + builder.AddRanges(arrow_r); + builder.AddRanges(triangles); + + builder.AddRanges(io.Fonts->GetGlyphRangesDefault()); + if (locale == FONT_RANGE_GREEK) + builder.AddRanges(io.Fonts->GetGlyphRangesGreek()); + + if (locale == FONT_RANGE_CYRILLIC) + builder.AddRanges(io.Fonts->GetGlyphRangesCyrillic()); + + builder.BuildRanges(&ranges); + + ImFont* font = io.Fonts->AddFontFromMemoryCompressedTTF( + SourceSansProRegular_compressed_data, + SourceSansProRegular_compressed_size, + size, nullptr, ranges.Data); + + IM_ASSERT(font != nullptr); + io.FontDefault = font; + + // Fonts can be found in fonts/ folder. + if (locale == FONT_RANGE_KOREAN) { + size /= 1.5f; + io.Fonts->AddFontFromMemoryCompressedTTF( + GmarketSans_compressed_data, + GmarketSans_compressed_size, + size, &config, io.Fonts->GetGlyphRangesKorean()); + } + else if (locale == FONT_RANGE_JAPANESE) { + io.Fonts->AddFontFromMemoryCompressedTTF( + NotoSansJP_compressed_data, + NotoSansJP_compressed_size, + size, &config, io.Fonts->GetGlyphRangesJapanese()); + } + else if (locale == FONT_RANGE_CHINESE_FULL) { + io.Fonts->AddFontFromMemoryCompressedTTF( + NotoSerifTC_compressed_data, + NotoSerifTC_compressed_size, + size, &config, io.Fonts->GetGlyphRangesChineseFull()); + } + else if (locale == FONT_RANGE_CHINESE_SIMPLE) { + io.Fonts->AddFontFromMemoryCompressedTTF( + NotoSansSC_compressed_data, + NotoSansSC_compressed_size, + size, &config, io.Fonts->GetGlyphRangesChineseSimplifiedCommon()); + } + else if (locale == FONT_RANGE_THAI) { + io.Fonts->AddFontFromMemoryCompressedTTF( + NotoSansThai_compressed_data, + NotoSansThai_compressed_size, + size, &config, io.Fonts->GetGlyphRangesThai()); + } + else if (locale == FONT_RANGE_VIETNAMESE) { + io.Fonts->AddFontFromMemoryCompressedTTF( + NotoSansJP_compressed_data, + NotoSansJP_compressed_size, + size, &config, io.Fonts->GetGlyphRangesVietnamese()); + } + + io.Fonts->Build(); +} \ No newline at end of file diff --git a/src/fonts.h b/src/fonts.h new file mode 100644 index 0000000..4a3bb93 --- /dev/null +++ b/src/fonts.h @@ -0,0 +1,15 @@ +#pragma once + +typedef enum t_ts_font_range { + FONT_RANGE_ENGLISH, + FONT_RANGE_GREEK, + FONT_RANGE_KOREAN, + FONT_RANGE_JAPANESE, + FONT_RANGE_CHINESE_FULL, + FONT_RANGE_CHINESE_SIMPLE, + FONT_RANGE_CYRILLIC, + FONT_RANGE_THAI, + FONT_RANGE_VIETNAMESE, +} ts_font_range; + +void ts_load_fonts(float size, ts_font_range locale); \ No newline at end of file diff --git a/src/windows/main_windows.cpp b/src/windows/main_windows.cpp index b7f29f7..3d136fb 100644 --- a/src/windows/main_windows.cpp +++ b/src/windows/main_windows.cpp @@ -11,6 +11,7 @@ #include "memory_bucket.h" #include "image.h" #include "config.h" +#include "fonts.h" #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif @@ -109,6 +110,43 @@ void ts_platform_set_window_title(utf8_int8_t* str) { SetWindowTextW(window_handle, wchar_buffer); } +ts_font_range _ts_get_FONT_RANGE_to_load() { + wchar_t buffer[50]; + GetUserDefaultLocaleName(buffer, 50); + + ts_font_range result = FONT_RANGE_ENGLISH; + if (wcscmp(buffer, L"el-GR") == 0) result = FONT_RANGE_GREEK; + if (wcscmp(buffer, L"ko-KR") == 0) result = FONT_RANGE_KOREAN; + if (wcscmp(buffer, L"ja-JP") == 0) result = FONT_RANGE_JAPANESE; + + if (wcscmp(buffer, L"be-BY") == 0) result = FONT_RANGE_CYRILLIC; + if (wcscmp(buffer, L"bg-BG") == 0) result = FONT_RANGE_CYRILLIC; + if (wcscmp(buffer, L"ru-RU") == 0) result = FONT_RANGE_CYRILLIC; + if (wcscmp(buffer, L"ru-MD") == 0) result = FONT_RANGE_CYRILLIC; + if (wcscmp(buffer, L"ro-MD") == 0) result = FONT_RANGE_CYRILLIC; + if (wcscmp(buffer, L"kk-KZ") == 0) result = FONT_RANGE_CYRILLIC; + if (wcscmp(buffer, L"tt-RU") == 0) result = FONT_RANGE_CYRILLIC; + if (wcscmp(buffer, L"ky-KG") == 0) result = FONT_RANGE_CYRILLIC; + if (wcscmp(buffer, L"mn-MN") == 0) result = FONT_RANGE_CYRILLIC; + if (wcscmp(buffer, L"az-Cyrl-AZ") == 0) result = FONT_RANGE_CYRILLIC; + if (wcscmp(buffer, L"uz-Cyrl-UZ") == 0) result = FONT_RANGE_CYRILLIC; + if (wcscmp(buffer, L"sr-Cyrl-CS") == 0) result = FONT_RANGE_CYRILLIC; + if (wcscmp(buffer, L"sr-Latn-CS") == 0) result = FONT_RANGE_CYRILLIC; + + if (wcscmp(buffer, L"bo-CN") == 0) result = FONT_RANGE_CHINESE_SIMPLE; + if (wcscmp(buffer, L"zh-CN") == 0) result = FONT_RANGE_CHINESE_SIMPLE; + if (wcscmp(buffer, L"mn-Mong-CN") == 0) result = FONT_RANGE_CHINESE_SIMPLE; + if (wcscmp(buffer, L"zh-HK") == 0) result = FONT_RANGE_CHINESE_FULL; + if (wcscmp(buffer, L"zh-TW") == 0) result = FONT_RANGE_CHINESE_FULL; + if (wcscmp(buffer, L"zh-SG") == 0) result = FONT_RANGE_CHINESE_SIMPLE; + if (wcscmp(buffer, L"zh-MO") == 0) result = FONT_RANGE_CHINESE_FULL; + + if (wcscmp(buffer, L"th-TH") == 0) result = FONT_RANGE_THAI; + if (wcscmp(buffer, L"vi-VN") == 0) result = FONT_RANGE_VIETNAMESE; + + return result; +} + int main(int, char**) { if (OleInitialize(NULL) != S_OK) { @@ -149,17 +187,14 @@ int main(int, char**) io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls io.IniFilename = _ts_platform_get_config_file_path(config_path); - // Setup Dear ImGui style ImGui::Spectrum::StyleColorsSpectrum(); - ImGui::Spectrum::LoadFont(18.0f); - //ImGui::StyleColorsLight(); - // Setup Platform/Renderer backends ImGui_ImplWin32_InitForOpenGL(hwnd); ImGui_ImplOpenGL3_Init(); QueryPerformanceFrequency(&Frequency); + ts_load_fonts(18.0f, _ts_get_FONT_RANGE_to_load()); ts_load_images(); ts_load_config(); -- cgit v1.2.3-70-g09d2