mirror of
https://github.com/ocornut/imgui.git
synced 2026-01-11 00:04:24 +00:00
Fonts: fixed handling of ImFontConfig::FontDataOwnedByAtlas = false which did erroneously make a copy of the font data. (#9086)
Amend 815168c7e
+ Added explicit casts for intent/clarity when passing to stb_truetype/freetype.
This commit is contained in:
parent
5f82275ba1
commit
98636f4a23
3 changed files with 8 additions and 9 deletions
|
|
@ -43,6 +43,11 @@ Breaking Changes:
|
||||||
|
|
||||||
Other Changes:
|
Other Changes:
|
||||||
|
|
||||||
|
- Fonts: fixed handling of `ImFontConfig::FontDataOwnedByAtlas = false` which
|
||||||
|
did erroneously make a copy of the font data, essentially defeating the purpose
|
||||||
|
of this flag and wasting memory.
|
||||||
|
Undetected since July 2015 and now spotted by @TellowKrinkle, this is perhaps
|
||||||
|
the oldest bug in Dear ImGui history (albeit for a rarely used feature)! (#9086)
|
||||||
- Scrollbar: fixed a codepath leading to a divide-by-zero (which would not be
|
- Scrollbar: fixed a codepath leading to a divide-by-zero (which would not be
|
||||||
noticeable by user but detected by sanitizers). (#9089) [@judicaelclair]
|
noticeable by user but detected by sanitizers). (#9089) [@judicaelclair]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3052,12 +3052,6 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg_in)
|
||||||
font->Sources.push_back(font_cfg);
|
font->Sources.push_back(font_cfg);
|
||||||
ImFontAtlasBuildUpdatePointers(this); // Pointers to Sources are otherwise dangling after we called Sources.push_back().
|
ImFontAtlasBuildUpdatePointers(this); // Pointers to Sources are otherwise dangling after we called Sources.push_back().
|
||||||
|
|
||||||
if (font_cfg->FontDataOwnedByAtlas == false)
|
|
||||||
{
|
|
||||||
font_cfg->FontDataOwnedByAtlas = true;
|
|
||||||
font_cfg->FontData = ImMemdup(font_cfg->FontData, (size_t)font_cfg->FontDataSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sanity check
|
// Sanity check
|
||||||
// We don't round cfg.SizePixels yet as relative size of merged fonts are used afterwards.
|
// We don't round cfg.SizePixels yet as relative size of merged fonts are used afterwards.
|
||||||
if (font_cfg->GlyphExcludeRanges != NULL)
|
if (font_cfg->GlyphExcludeRanges != NULL)
|
||||||
|
|
@ -4583,14 +4577,14 @@ static bool ImGui_ImplStbTrueType_FontSrcInit(ImFontAtlas* atlas, ImFontConfig*
|
||||||
IM_ASSERT(src->FontLoaderData == NULL);
|
IM_ASSERT(src->FontLoaderData == NULL);
|
||||||
|
|
||||||
// Initialize helper structure for font loading and verify that the TTF/OTF data is correct
|
// Initialize helper structure for font loading and verify that the TTF/OTF data is correct
|
||||||
const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)src->FontData, src->FontNo);
|
const int font_offset = stbtt_GetFontOffsetForIndex((const unsigned char*)src->FontData, src->FontNo);
|
||||||
if (font_offset < 0)
|
if (font_offset < 0)
|
||||||
{
|
{
|
||||||
IM_DELETE(bd_font_data);
|
IM_DELETE(bd_font_data);
|
||||||
IM_ASSERT_USER_ERROR(0, "stbtt_GetFontOffsetForIndex(): FontData is incorrect, or FontNo cannot be found.");
|
IM_ASSERT_USER_ERROR(0, "stbtt_GetFontOffsetForIndex(): FontData is incorrect, or FontNo cannot be found.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!stbtt_InitFont(&bd_font_data->FontInfo, (unsigned char*)src->FontData, font_offset))
|
if (!stbtt_InitFont(&bd_font_data->FontInfo, (const unsigned char*)src->FontData, font_offset))
|
||||||
{
|
{
|
||||||
IM_DELETE(bd_font_data);
|
IM_DELETE(bd_font_data);
|
||||||
IM_ASSERT_USER_ERROR(0, "stbtt_InitFont(): failed to parse FontData. It is correct and complete? Check FontDataSize.");
|
IM_ASSERT_USER_ERROR(0, "stbtt_InitFont(): failed to parse FontData. It is correct and complete? Check FontDataSize.");
|
||||||
|
|
|
||||||
|
|
@ -174,7 +174,7 @@ struct ImGui_ImplFreeType_FontSrcBakedData
|
||||||
|
|
||||||
bool ImGui_ImplFreeType_FontSrcData::InitFont(FT_Library ft_library, ImFontConfig* src, ImGuiFreeTypeLoaderFlags extra_font_loader_flags)
|
bool ImGui_ImplFreeType_FontSrcData::InitFont(FT_Library ft_library, ImFontConfig* src, ImGuiFreeTypeLoaderFlags extra_font_loader_flags)
|
||||||
{
|
{
|
||||||
FT_Error error = FT_New_Memory_Face(ft_library, (uint8_t*)src->FontData, (FT_Long)src->FontDataSize, (FT_Long)src->FontNo, &FtFace);
|
FT_Error error = FT_New_Memory_Face(ft_library, (const FT_Byte*)src->FontData, (FT_Long)src->FontDataSize, (FT_Long)src->FontNo, &FtFace);
|
||||||
if (error != 0)
|
if (error != 0)
|
||||||
return false;
|
return false;
|
||||||
error = FT_Select_Charmap(FtFace, FT_ENCODING_UNICODE);
|
error = FT_Select_Charmap(FtFace, FT_ENCODING_UNICODE);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue