Я разрабатываю перевод на небольшом скрипте, который использует 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 (), но приложение падало после внедрения. Вот функция обработки преобразования base85 из ImGui:
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 в комплекте).
Я нашел решение этой проблемы. Если вам действительно нужно использовать 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);
Это избавляет от проблемы преобразования строки в char и других вещей, связанных с импортом base85.
Других решений пока нет …