mirror of
https://github.com/ocornut/imgui.git
synced 2026-06-22 06:16:34 +00:00
Fonts: assert when using MergeMode with an explicit size over a target font with an implicit size, as scale factor are likely erroneous. (#9361)
This commit is contained in:
@@ -76,6 +76,8 @@ Other Changes:
|
|||||||
before layout has been locked (first row or headers row submitted). (#8250)
|
before layout has been locked (first row or headers row submitted). (#8250)
|
||||||
- Fonts:
|
- Fonts:
|
||||||
- imgui_freetype: add FreeType headers & compiled version in 'About Dear ImGui' details.
|
- imgui_freetype: add FreeType headers & compiled version in 'About Dear ImGui' details.
|
||||||
|
- Assert when using MergeMode with an explicit size over a target font with an implicit
|
||||||
|
size, as scale factor are likely erroneous. (#9361)
|
||||||
- Clipper:
|
- Clipper:
|
||||||
- Improved error reporting when misusing the clipper inside a table (prioritize
|
- Improved error reporting when misusing the clipper inside a table (prioritize
|
||||||
reporting the common clipper error over a table sanity check assert). (#9350)
|
reporting the common clipper error over a table sanity check assert). (#9350)
|
||||||
|
|||||||
1
imgui.h
1
imgui.h
@@ -3861,6 +3861,7 @@ enum ImFontFlags_
|
|||||||
ImFontFlags_NoLoadError = 1 << 1, // Disable throwing an error/assert when calling AddFontXXX() with missing file/data. Calling code is expected to check AddFontXXX() return value.
|
ImFontFlags_NoLoadError = 1 << 1, // Disable throwing an error/assert when calling AddFontXXX() with missing file/data. Calling code is expected to check AddFontXXX() return value.
|
||||||
ImFontFlags_NoLoadGlyphs = 1 << 2, // [Internal] Disable loading new glyphs.
|
ImFontFlags_NoLoadGlyphs = 1 << 2, // [Internal] Disable loading new glyphs.
|
||||||
ImFontFlags_LockBakedSizes = 1 << 3, // [Internal] Disable loading new baked sizes, disable garbage collecting current ones. e.g. if you want to lock a font to a single size. Important: if you use this to preload given sizes, consider the possibility of multiple font density used on Retina display.
|
ImFontFlags_LockBakedSizes = 1 << 3, // [Internal] Disable loading new baked sizes, disable garbage collecting current ones. e.g. if you want to lock a font to a single size. Important: if you use this to preload given sizes, consider the possibility of multiple font density used on Retina display.
|
||||||
|
ImFontFlags_ImplicitRefSize = 1 << 4, // [Internal] Reference size was not set explicitly.
|
||||||
};
|
};
|
||||||
|
|
||||||
// Font runtime data and rendering
|
// Font runtime data and rendering
|
||||||
|
|||||||
@@ -3039,7 +3039,7 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg_in)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
IM_ASSERT(Fonts.Size > 0 && "Cannot use MergeMode for the first font"); // When using MergeMode make sure that a font has already been added before.
|
IM_ASSERT(Fonts.Size > 0 && "Cannot use MergeMode for the first font!"); // When using MergeMode make sure that a font has already been added before.
|
||||||
font = font_cfg_in->DstFont ? font_cfg_in->DstFont : Fonts.back();
|
font = font_cfg_in->DstFont ? font_cfg_in->DstFont : Fonts.back();
|
||||||
ImFontAtlasFontDiscardBakes(this, font, 0); // Need to discard bakes if the font was already used, because baked->FontLoaderDatas[] will change size. (#9162)
|
ImFontAtlasFontDiscardBakes(this, font, 0); // Need to discard bakes if the font was already used, because baked->FontLoaderDatas[] will change size. (#9162)
|
||||||
}
|
}
|
||||||
@@ -3067,6 +3067,11 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg_in)
|
|||||||
IM_ASSERT(font_cfg->FontLoader->FontBakedLoadGlyph != NULL);
|
IM_ASSERT(font_cfg->FontLoader->FontBakedLoadGlyph != NULL);
|
||||||
IM_ASSERT(font_cfg->FontLoader->LoaderInit == NULL && font_cfg->FontLoader->LoaderShutdown == NULL); // FIXME-NEWATLAS: Unsupported yet.
|
IM_ASSERT(font_cfg->FontLoader->LoaderInit == NULL && font_cfg->FontLoader->LoaderShutdown == NULL); // FIXME-NEWATLAS: Unsupported yet.
|
||||||
}
|
}
|
||||||
|
// | Target w/ Implicit RefSize | Target w/ Explicit RefSize |
|
||||||
|
// Adding w/ Implicit RefSize: | OK (same scale) | OK (same scale) |
|
||||||
|
// Adding w/ Explicit RefSize: | KO | OK (custom scale) |
|
||||||
|
if (font_cfg_in->MergeMode && font_cfg_in->SizePixels > 0)
|
||||||
|
IM_ASSERT((font->Flags & ImFontFlags_ImplicitRefSize) == 0 && "Cannot use MergeMode with an explicit reference size when the destination font used an implicit reference size!");
|
||||||
IM_ASSERT(font_cfg->FontLoaderData == NULL);
|
IM_ASSERT(font_cfg->FontLoaderData == NULL);
|
||||||
|
|
||||||
if (!ImFontAtlasFontSourceInit(this, font_cfg))
|
if (!ImFontAtlasFontSourceInit(this, font_cfg))
|
||||||
@@ -3134,7 +3139,10 @@ ImFont* ImFontAtlas::AddFontDefaultBitmap(const ImFontConfig* font_cfg_template)
|
|||||||
if (!font_cfg_template)
|
if (!font_cfg_template)
|
||||||
font_cfg.PixelSnapH = true; // Prevents sub-integer scaling factors at lower-level layers.
|
font_cfg.PixelSnapH = true; // Prevents sub-integer scaling factors at lower-level layers.
|
||||||
if (font_cfg.SizePixels <= 0.0f)
|
if (font_cfg.SizePixels <= 0.0f)
|
||||||
|
{
|
||||||
font_cfg.SizePixels = 13.0f; // This only serves (1) as a reference for GlyphOffset.y setting and (2) as a default for pre-1.92 backend.
|
font_cfg.SizePixels = 13.0f; // This only serves (1) as a reference for GlyphOffset.y setting and (2) as a default for pre-1.92 backend.
|
||||||
|
font_cfg.Flags |= ImFontFlags_ImplicitRefSize;
|
||||||
|
}
|
||||||
if (font_cfg.Name[0] == '\0')
|
if (font_cfg.Name[0] == '\0')
|
||||||
ImFormatString(font_cfg.Name, IM_COUNTOF(font_cfg.Name), "ProggyClean.ttf");
|
ImFormatString(font_cfg.Name, IM_COUNTOF(font_cfg.Name), "ProggyClean.ttf");
|
||||||
font_cfg.EllipsisChar = (ImWchar)0x0085;
|
font_cfg.EllipsisChar = (ImWchar)0x0085;
|
||||||
@@ -3159,7 +3167,10 @@ ImFont* ImFontAtlas::AddFontDefaultVector(const ImFontConfig* font_cfg_template)
|
|||||||
if (!font_cfg_template)
|
if (!font_cfg_template)
|
||||||
font_cfg.PixelSnapH = true; // Precisely match ProggyClean, but prevents sub-integer scaling factors at lower-level layers.
|
font_cfg.PixelSnapH = true; // Precisely match ProggyClean, but prevents sub-integer scaling factors at lower-level layers.
|
||||||
if (font_cfg.SizePixels <= 0.0f)
|
if (font_cfg.SizePixels <= 0.0f)
|
||||||
|
{
|
||||||
font_cfg.SizePixels = 13.0f;
|
font_cfg.SizePixels = 13.0f;
|
||||||
|
font_cfg.Flags |= ImFontFlags_ImplicitRefSize;
|
||||||
|
}
|
||||||
if (font_cfg.Name[0] == '\0')
|
if (font_cfg.Name[0] == '\0')
|
||||||
ImFormatString(font_cfg.Name, IM_COUNTOF(font_cfg.Name), "ProggyForever.ttf");
|
ImFormatString(font_cfg.Name, IM_COUNTOF(font_cfg.Name), "ProggyForever.ttf");
|
||||||
font_cfg.ExtraSizeScale *= 1.015f; // Match ProggyClean
|
font_cfg.ExtraSizeScale *= 1.015f; // Match ProggyClean
|
||||||
|
|||||||
@@ -428,8 +428,9 @@ static bool ImGui_ImplFreeType_FontBakedInit(ImFontAtlas* atlas, ImFontConfig* s
|
|||||||
{
|
{
|
||||||
IM_UNUSED(atlas);
|
IM_UNUSED(atlas);
|
||||||
float size = baked->Size;
|
float size = baked->Size;
|
||||||
|
const float ref_size = baked->OwnerFont->Sources[0]->SizePixels;
|
||||||
if (src->MergeMode && src->SizePixels != 0.0f)
|
if (src->MergeMode && src->SizePixels != 0.0f)
|
||||||
size *= (src->SizePixels / baked->OwnerFont->Sources[0]->SizePixels);
|
size *= (src->SizePixels / ref_size);
|
||||||
size *= src->ExtraSizeScale;
|
size *= src->ExtraSizeScale;
|
||||||
|
|
||||||
ImGui_ImplFreeType_FontSrcData* bd_font_data = (ImGui_ImplFreeType_FontSrcData*)src->FontLoaderData;
|
ImGui_ImplFreeType_FontSrcData* bd_font_data = (ImGui_ImplFreeType_FontSrcData*)src->FontLoaderData;
|
||||||
|
|||||||
Reference in New Issue
Block a user