|
@@ -2594,6 +2594,7 @@ ImFont::ImFont()
|
|
|
Scale = 1.0f;
|
|
|
Ascent = Descent = 0.0f;
|
|
|
MetricsTotalSurface = 0;
|
|
|
+ memset(Used4kPagesMap, 0, sizeof(Used4kPagesMap));
|
|
|
}
|
|
|
|
|
|
ImFont::~ImFont()
|
|
@@ -2626,12 +2627,17 @@ void ImFont::BuildLookupTable()
|
|
|
IndexAdvanceX.clear();
|
|
|
IndexLookup.clear();
|
|
|
DirtyLookupTables = false;
|
|
|
+ memset(Used4kPagesMap, 0, sizeof(Used4kPagesMap));
|
|
|
GrowIndex(max_codepoint + 1);
|
|
|
for (int i = 0; i < Glyphs.Size; i++)
|
|
|
{
|
|
|
int codepoint = (int)Glyphs[i].Codepoint;
|
|
|
IndexAdvanceX[codepoint] = Glyphs[i].AdvanceX;
|
|
|
IndexLookup[codepoint] = (ImWchar)i;
|
|
|
+
|
|
|
+ // Mark 4K page as used
|
|
|
+ const int page_n = codepoint / 4096;
|
|
|
+ Used4kPagesMap[page_n >> 3] |= 1 << (page_n & 7);
|
|
|
}
|
|
|
|
|
|
// Create a glyph to handle TAB
|
|
@@ -2660,6 +2666,19 @@ void ImFont::BuildLookupTable()
|
|
|
IndexAdvanceX[i] = FallbackAdvanceX;
|
|
|
}
|
|
|
|
|
|
+// API is designed this way to avoid exposing the 4K page size
|
|
|
+// e.g. use with IsGlyphRangeUnused(0, 255)
|
|
|
+bool ImFont::IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last)
|
|
|
+{
|
|
|
+ unsigned int page_begin = (c_begin / 4096);
|
|
|
+ unsigned int page_last = (c_last / 4096);
|
|
|
+ for (unsigned int page_n = page_begin; page_n <= page_last; page_n++)
|
|
|
+ if ((page_n >> 3) < sizeof(Used4kPagesMap))
|
|
|
+ if (Used4kPagesMap[page_n >> 3] & (1 << (page_n & 7)))
|
|
|
+ return false;
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
void ImFont::SetGlyphVisible(ImWchar c, bool visible)
|
|
|
{
|
|
|
if (ImFontGlyph* glyph = (ImFontGlyph*)(void*)FindGlyph((ImWchar)c))
|