local ffi = require('ffi')
local imgui = require('upmimgui')
local faicons = require('fAwesome6')
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local glyph_ranges_font, glyph_ranges_icon --, fa_font
function imgui.ImVector_ImWchar()
local ImVector = ffi.new('ImVector_ImWchar')
return ImVector
end
local function loadDefaultFont(font_name)
local io = imgui.GetIO()
local dpi = imgui.GetDpiScale()
local dsm = imgui.GetDpiScalingMode()
if not glyph_ranges_font then
glyph_ranges_font = imgui.ImVector_ImWchar()
local builder = imgui.ImFontGlyphRangesBuilder()
builder:AddRanges(io.Fonts:GetGlyphRangesCyrillic())
builder:AddText(u8 [[‚„…†‡€‰‹‘’“”•–—™›№]]) -- fix invalid glyphs, usage with u8 in imgui
builder:BuildRanges(glyph_ranges_font)
end
local path_font_file = string.format('%s\\resource\\%s.ttf', getWorkingDirectory(), font_name)
assert(doesFileExist(path_font_file), string.format('Font "%s" doesn\'t exist!', path_font_file))
local font_size = dsm == 3 and math.floor(dpi * 16) or 16
io.Fonts:AddFontFromFileTTF(
path_font_file,
font_size,
nil,
glyph_ranges_font.Data ---@diagnostic disable-line
)
end
local function loadFontAwesome()
local io = imgui.GetIO()
local config = imgui.ImFontConfig()
local dpi = imgui.GetDpiScale()
local dsm = imgui.GetDpiScalingMode()
config.OversampleV = 1
config.OversampleH = 1
config.MergeMode = true -- Интегрировать в основном шрифт
config.PixelSnapH = true
-- Сделает цветные эмоджи в FreeType https://github.com/ocornut/imgui/blob/master/docs/FONTS.md#using-colorful-glyphsemojis
-- config.FontBuilderFlags = bit.bor(config.FontBuilderFlags, imgui.FreeTypeBuilderFlags.LoadColor)
local list_icon = {
'square_rss',
'keyboard',
'coins',
'square_poll_horizontal',
'gear',
'wrench',
'arrow_left'
}
if not glyph_ranges_icon then
glyph_ranges_icon = imgui.ImVector_ImWchar()
local builder = imgui.ImFontGlyphRangesBuilder()
for _, name_font in ipairs(list_icon) do
builder:AddText(faicons(name_font))
end
builder:BuildRanges(glyph_ranges_icon)
end
local font_size = dsm == 3 and math.floor(dpi * 16) or 16
io.Fonts:AddFontFromMemoryCompressedBase85TTF(
faicons.get_font_data_base85('solid'),
font_size,
config,
glyph_ranges_icon.Data ---@diagnostic disable-line
)
end
local function initFonts(font_name)
imgui.GetIO().Fonts:Clear()
loadDefaultFont(font_name) -- основной (первый) шрифт
loadFontAwesome() -- дополняет иконки в основном шрифте
imgui.InvalidateFontsTexture() -- обязательно после смены шрифтов
end
imgui.OnInitialize(function()
imgui.GetIO().IniFilename = nil
initFonts('Roboto-Medium')
end)