在 ImGui 中嵌入大于 char 大小的字体

Posted

技术标签:

【中文标题】在 ImGui 中嵌入大于 char 大小的字体【英文标题】:Embed font larger than char size in ImGui 【发布时间】:2018-02-23 00:33:10 【问题描述】:

我正在使用 ImGui 作为前端的小脚本开发翻译。我需要扩展的 unicode 字符集才能以将要使用的字体提供。由于此脚本是通过 DLL 注入的,因此无法使用(我想是的。我根本没有使用 c++ 的经验。):

io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels);

从 ttf 文件添加字体导致 data == NULL;

void* data = ImFileLoadToMemory(filename, "rb", &data_size, 0);
if (!data)

    IM_ASSERT(0); // Could not load file.
    return NULL;

我也尝试使用 io.Fonts->AddFontFromMemoryCompressedBase85TTF 并通过包含的 binary_to_compressed_c 编译字体,但输出太大了,我得到了:

致命错误 C1091:编译器限制:字符串长度超过 65535 个字节

但函数不接受除 char* 之外的任何类型。我将字符连接成字符串,然后通过 str() 和 c_str() 重新组装它,但应用程序在注入后崩溃。这是从 ImGui 处理 base85 转换的函数:

ImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges)

    int compressed_ttf_size = (((int)strlen(compressed_ttf_data_base85) + 4) / 5) * 4;
    void* compressed_ttf = ImGui::MemAlloc((size_t)compressed_ttf_size);
    Decode85((const unsigned char*)compressed_ttf_data_base85, (unsigned char*)compressed_ttf);
    ImFont* font = AddFontFromMemoryCompressedTTF(compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges);
    ImGui::MemFree(compressed_ttf);
    return font;

我该如何解决这个问题?我已经尝试了一切,但没有任何效果。只有将较小的字符传递给编译函数才有效(与捆绑的 Cousine_Regular.ttf 一起尝试)。

【问题讨论】:

【参考方案1】:

我找到了解决此问题的方法。如果您确实需要使用 BASE85,仍然没有答案,但是您可以通过转换为 int 类型来增加大小限制(不要将 -base85 放入 binary_to_compressed_c.exe),然后将结果表插入头文件并使用 ImGui 提供的指令,如下所示:

头文件:

// File: 'DroidSans.ttf' (190044 bytes)
// Exported using binary_to_compressed_c.cpp
static const unsigned int droid_compressed_size = 134345;
static const unsigned int droid_compressed_data[134348 / 4] =

您的导入/渲染文件:

static const ImWchar ranges[] =  0x0020, 0x00FF, 0x0100, 0x017F, 0 ;
//Because I need extended characters im passing my array to function.

io.Fonts->AddFontFromMemoryCompressedTTF(droid_compressed_data, droid_compressed_size, 16.0f, NULL, ranges);

这解决了从字符串转换为字符以及其他与 base85 导入相关的问题。

【讨论】:

以上是关于在 ImGui 中嵌入大于 char 大小的字体的主要内容,如果未能解决你的问题,请参考以下文章

如何在情节提要中为uilabel设置大于300的字体大小?

占位符字体大小大于 16px

怎么把字体调到最大

Imgui自定义中文字符集

在 ImGui::InputText(...) 中使用 std::string

iframe中字体大小的问题