Files
dayz-dma/external/lumin/framework/helpers/fonts.cpp
T

113 lines
3.3 KiB
C++

#include "../headers/includes.h"
#include "../../thirdparty/imgui/imgui_freetype.h"
#include "imgui_impl_dx11.h"
static const ImWchar* get_private_icon_ranges()
{
static const ImWchar ranges[] =
{
0x26A0, 0x26A0, // warning sign
0x26D4, 0x26D4, // no entry
0x2714, 0x2714, // heavy check mark
0xE70D, 0xE70E, // Segoe MDL2 chevrons
0xF1E7, 0xF1E7, // fi-rr-backpack
0xF309, 0xF309, // fi-rr-bullseye
0xF3A2, 0xF3A2, // fi-rr-chart-histogram
0xF5F8, 0xF5F8, // fi-rr-eye
0xF71C, 0xF71C, // fi-rr-grid
0xF87D, 0xF87D, // fi-rr-layout-fluid
0xF8E1, 0xF8E1, // fi-rr-magic-wand
0xFB7C, 0xFB7C, // fi-rr-running
0xFD32, 0xFD32, // fi-rr-sword
0xFD5F, 0xFD5F, // fi-rr-target
0xFE19, 0xFE19, // fi-rr-treasure-chest
0xFEA0, 0xFEA0, // fi-rr-user
0xFEA6, 0xFEA6, // fi-rr-users
0xFF21, 0xFF21, // fi-rr-world
0
};
return ranges;
}
void c_font::update()
{
if (var->gui.dpi_changed)
{
var->gui.dpi = var->gui.stored_dpi / 100.f;
ImGuiIO& io = ImGui::GetIO();
ImGui_ImplDX11_InvalidateDeviceObjects();
io.Fonts->Clear();
for (auto& font_t : data)
{
ImFontConfig cfg;
if (font_t.file)
{
cfg.FontBuilderFlags = ImGuiFreeTypeBuilderFlags_ForceAutoHint;
const ImWchar* ranges = font_t.private_glyphs ? get_private_icon_ranges() : io.Fonts->GetGlyphRangesCyrillic();
font_t.font = io.Fonts->AddFontFromFileTTF(font_t.file_path.c_str(), s_(font_t.size), &cfg, ranges);
}
else
{
cfg.FontBuilderFlags = ImGuiFreeTypeBuilderFlags_ForceAutoHint | ImGuiFreeTypeBuilderFlags_Bitmap;
cfg.FontDataOwnedByAtlas = false;
font_t.font = io.Fonts->AddFontFromMemoryTTF(font_t.data.data(), font_t.data.size(), s_(font_t.size), &cfg, io.Fonts->GetGlyphRangesCyrillic());
}
}
io.Fonts->Build();
ImGui_ImplDX11_CreateDeviceObjects();
var->gui.dpi_changed = false;
}
}
ImFont* c_font::get(const std::vector<unsigned char>& font_data, float size)
{
const void* source = font_data.empty() ? nullptr : font_data.data();
for (auto& font_t : data)
{
if (!font_t.file && font_t.source == source && font_t.size == size)
{
return font_t.font;
}
}
add(font_data, size);
var->gui.dpi_changed = true;
return get(font_data, size);
}
ImFont* c_font::get_file(const std::string& file_path, float size, bool private_glyphs)
{
for (auto& font_t : data)
{
if (font_t.file && font_t.file_path == file_path && font_t.size == size && font_t.private_glyphs == private_glyphs)
{
return font_t.font;
}
}
add_file(file_path, size, private_glyphs);
var->gui.dpi_changed = true;
return nullptr;
}
void c_font::add(const std::vector<unsigned char>& font_data, float size)
{
const void* source = font_data.empty() ? nullptr : font_data.data();
data.push_back({ font_data, "", source, size, nullptr, false, false });
}
void c_font::add_file(const std::string& file_path, float size, bool private_glyphs)
{
data.push_back({ {}, file_path, nullptr, size, nullptr, true, private_glyphs });
}