mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Fonts: Prefer using U+FFFD character for fallback instead of '?'. Use U+FF0E dot character to construct an ellipsis if U+002E '.' is not available. (#4269)
This commit is contained in:
parent
8ced41570e
commit
38165f420f
@ -49,6 +49,8 @@ Other Changes:
|
|||||||
- TabBar: Fixed using more than 32 KB-worth of tab names. (#4176)
|
- TabBar: Fixed using more than 32 KB-worth of tab names. (#4176)
|
||||||
- Fixed printf-style format checks on non-MinGW flavors. (#4183, #3592)
|
- Fixed printf-style format checks on non-MinGW flavors. (#4183, #3592)
|
||||||
- Fonts: Functions with a 'float size_pixels' parameter can accept zero if it is set in ImFontSize::SizePixels.
|
- Fonts: Functions with a 'float size_pixels' parameter can accept zero if it is set in ImFontSize::SizePixels.
|
||||||
|
- Fonts: Prefer using U+FFFD character for fallback instead of '?', if available. (#4269)
|
||||||
|
- Fonts: Use U+FF0E dot character to construct an ellipsis if U+002E '.' is not available. (#4269)
|
||||||
- Demo: Fixed requirement in 1.83 to link with imgui_demo.cpp if IMGUI_DISABLE_METRICS_WINDOW is not set. (#4171)
|
- Demo: Fixed requirement in 1.83 to link with imgui_demo.cpp if IMGUI_DISABLE_METRICS_WINDOW is not set. (#4171)
|
||||||
Normally the right way to disable compiling the demo is to set IMGUI_DISABLE_DEMO_WINDOWS, but we want to avoid
|
Normally the right way to disable compiling the demo is to set IMGUI_DISABLE_DEMO_WINDOWS, but we want to avoid
|
||||||
implying that the file is required.
|
implying that the file is required.
|
||||||
|
@ -2786,7 +2786,7 @@ void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, con
|
|||||||
int ellipsis_char_count = 1;
|
int ellipsis_char_count = 1;
|
||||||
if (ellipsis_char == (ImWchar)-1)
|
if (ellipsis_char == (ImWchar)-1)
|
||||||
{
|
{
|
||||||
ellipsis_char = (ImWchar)'.';
|
ellipsis_char = font->DotChar;
|
||||||
ellipsis_char_count = 3;
|
ellipsis_char_count = 3;
|
||||||
}
|
}
|
||||||
const ImFontGlyph* glyph = font->FindGlyph(ellipsis_char);
|
const ImFontGlyph* glyph = font->FindGlyph(ellipsis_char);
|
||||||
|
3
imgui.h
3
imgui.h
@ -2709,7 +2709,8 @@ struct ImFont
|
|||||||
const ImFontConfig* ConfigData; // 4-8 // in // // Pointer within ContainerAtlas->ConfigData
|
const ImFontConfig* ConfigData; // 4-8 // in // // Pointer within ContainerAtlas->ConfigData
|
||||||
short ConfigDataCount; // 2 // in // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont.
|
short ConfigDataCount; // 2 // in // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont.
|
||||||
ImWchar FallbackChar; // 2 // in // = '?' // Replacement character if a glyph isn't found. Only set via SetFallbackChar()
|
ImWchar FallbackChar; // 2 // in // = '?' // Replacement character if a glyph isn't found. Only set via SetFallbackChar()
|
||||||
ImWchar EllipsisChar; // 2 // out // = -1 // Character used for ellipsis rendering.
|
ImWchar EllipsisChar; // 2 // out // = '...' // Character used for ellipsis rendering.
|
||||||
|
ImWchar DotChar; // 2 // out // = '.' // Dot character used for fallback ellipsis rendering.
|
||||||
bool DirtyLookupTables; // 1 // out //
|
bool DirtyLookupTables; // 1 // out //
|
||||||
float Scale; // 4 // in // = 1.f // Base font scale, multiplied by the per-window font scale which you can adjust with SetWindowFontScale()
|
float Scale; // 4 // in // = 1.f // Base font scale, multiplied by the per-window font scale which you can adjust with SetWindowFontScale()
|
||||||
float Ascent, Descent; // 4+4 // out // // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]
|
float Ascent, Descent; // 4+4 // out // // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]
|
||||||
|
@ -2795,23 +2795,6 @@ void ImFontAtlasBuildFinish(ImFontAtlas* atlas)
|
|||||||
for (int i = 0; i < atlas->Fonts.Size; i++)
|
for (int i = 0; i < atlas->Fonts.Size; i++)
|
||||||
if (atlas->Fonts[i]->DirtyLookupTables)
|
if (atlas->Fonts[i]->DirtyLookupTables)
|
||||||
atlas->Fonts[i]->BuildLookupTable();
|
atlas->Fonts[i]->BuildLookupTable();
|
||||||
|
|
||||||
// Ellipsis character is required for rendering elided text. We prefer using U+2026 (horizontal ellipsis).
|
|
||||||
// However some old fonts may contain ellipsis at U+0085. Here we auto-detect most suitable ellipsis character.
|
|
||||||
// FIXME: Also note that 0x2026 is currently seldom included in our font ranges. Because of this we are more likely to use three individual dots.
|
|
||||||
for (int i = 0; i < atlas->Fonts.size(); i++)
|
|
||||||
{
|
|
||||||
ImFont* font = atlas->Fonts[i];
|
|
||||||
if (font->EllipsisChar != (ImWchar)-1)
|
|
||||||
continue;
|
|
||||||
const ImWchar ellipsis_variants[] = { (ImWchar)0x2026, (ImWchar)0x0085 };
|
|
||||||
for (int j = 0; j < IM_ARRAYSIZE(ellipsis_variants); j++)
|
|
||||||
if (font->FindGlyphNoFallback(ellipsis_variants[j]) != NULL) // Verify glyph exists
|
|
||||||
{
|
|
||||||
font->EllipsisChar = ellipsis_variants[j];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve list of range (2 int per range, values are inclusive)
|
// Retrieve list of range (2 int per range, values are inclusive)
|
||||||
@ -3110,8 +3093,9 @@ ImFont::ImFont()
|
|||||||
{
|
{
|
||||||
FontSize = 0.0f;
|
FontSize = 0.0f;
|
||||||
FallbackAdvanceX = 0.0f;
|
FallbackAdvanceX = 0.0f;
|
||||||
FallbackChar = (ImWchar)'?';
|
FallbackChar = (ImWchar)-1;
|
||||||
EllipsisChar = (ImWchar)-1;
|
EllipsisChar = (ImWchar)-1;
|
||||||
|
DotChar = (ImWchar)-1;
|
||||||
FallbackGlyph = NULL;
|
FallbackGlyph = NULL;
|
||||||
ContainerAtlas = NULL;
|
ContainerAtlas = NULL;
|
||||||
ConfigData = NULL;
|
ConfigData = NULL;
|
||||||
@ -3142,6 +3126,14 @@ void ImFont::ClearOutputData()
|
|||||||
MetricsTotalSurface = 0;
|
MetricsTotalSurface = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ImWchar FindFirstExistingGlyph(ImFont* font, const ImWchar* candidate_chars, int candidate_chars_count)
|
||||||
|
{
|
||||||
|
for (int n = 0; n < candidate_chars_count; n++)
|
||||||
|
if (font->FindGlyphNoFallback(candidate_chars[n]) != NULL)
|
||||||
|
return candidate_chars[n];
|
||||||
|
return (ImWchar)-1;
|
||||||
|
}
|
||||||
|
|
||||||
void ImFont::BuildLookupTable()
|
void ImFont::BuildLookupTable()
|
||||||
{
|
{
|
||||||
int max_codepoint = 0;
|
int max_codepoint = 0;
|
||||||
@ -3184,9 +3176,31 @@ void ImFont::BuildLookupTable()
|
|||||||
SetGlyphVisible((ImWchar)' ', false);
|
SetGlyphVisible((ImWchar)' ', false);
|
||||||
SetGlyphVisible((ImWchar)'\t', false);
|
SetGlyphVisible((ImWchar)'\t', false);
|
||||||
|
|
||||||
// Setup fall-backs
|
// Ellipsis character is required for rendering elided text. We prefer using U+2026 (horizontal ellipsis).
|
||||||
|
// However some old fonts may contain ellipsis at U+0085. Here we auto-detect most suitable ellipsis character.
|
||||||
|
// FIXME: Note that 0x2026 is rarely included in our font ranges. Because of this we are more likely to use three individual dots.
|
||||||
|
const ImWchar ellipsis_chars[] = { (ImWchar)0x2026, (ImWchar)0x0085 };
|
||||||
|
const ImWchar dots_chars[] = { (ImWchar)'.', (ImWchar)0xFF0E };
|
||||||
|
if (EllipsisChar == (ImWchar)-1)
|
||||||
|
EllipsisChar = FindFirstExistingGlyph(this, ellipsis_chars, IM_ARRAYSIZE(ellipsis_chars));
|
||||||
|
if (DotChar == (ImWchar)-1)
|
||||||
|
DotChar = FindFirstExistingGlyph(this, dots_chars, IM_ARRAYSIZE(dots_chars));
|
||||||
|
|
||||||
|
// Setup fallback character
|
||||||
|
const ImWchar fallback_chars[] = { (ImWchar)IM_UNICODE_CODEPOINT_INVALID, (ImWchar)'?', (ImWchar)' ' };
|
||||||
FallbackGlyph = FindGlyphNoFallback(FallbackChar);
|
FallbackGlyph = FindGlyphNoFallback(FallbackChar);
|
||||||
FallbackAdvanceX = FallbackGlyph ? FallbackGlyph->AdvanceX : 0.0f;
|
if (FallbackGlyph == NULL)
|
||||||
|
{
|
||||||
|
FallbackChar = FindFirstExistingGlyph(this, fallback_chars, IM_ARRAYSIZE(fallback_chars));
|
||||||
|
FallbackGlyph = FindGlyphNoFallback(FallbackChar);
|
||||||
|
if (FallbackGlyph == NULL)
|
||||||
|
{
|
||||||
|
FallbackGlyph = &Glyphs.back();
|
||||||
|
FallbackChar = FallbackGlyph->Codepoint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FallbackAdvanceX = FallbackGlyph->AdvanceX;
|
||||||
for (int i = 0; i < max_codepoint + 1; i++)
|
for (int i = 0; i < max_codepoint + 1; i++)
|
||||||
if (IndexAdvanceX[i] < 0.0f)
|
if (IndexAdvanceX[i] < 0.0f)
|
||||||
IndexAdvanceX[i] = FallbackAdvanceX;
|
IndexAdvanceX[i] = FallbackAdvanceX;
|
||||||
|
Loading…
Reference in New Issue
Block a user