在ImGui

时间:2018-02-23 00:33:10

标签: c++ c++11 char imgui

我在使用ImGui作为前端的小脚本上开发翻译。我需要扩展的unicode字符集,以便使用的字体。由于这个脚本是通过DLL注入的,所以没办法(我想是这样的。我根本没有使用c ++的经验。)使用:

  

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

从ttf文件添加字体导致数据错误== 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 个答案:

答案 0 :(得分:0)

我找到了解决此问题的方法。如果你确实需要使用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导入相关的其他问题的问题。