|
@@ -1677,14 +1677,8 @@ void ImFont::BuildLookupTable()
|
|
|
|
|
|
IM_ASSERT(Glyphs.Size < 32*1024);
|
|
|
IndexXAdvance.clear();
|
|
|
- IndexXAdvance.resize(max_codepoint + 1);
|
|
|
IndexLookup.clear();
|
|
|
- IndexLookup.resize(max_codepoint + 1);
|
|
|
- for (int i = 0; i < max_codepoint + 1; i++)
|
|
|
- {
|
|
|
- IndexXAdvance[i] = -1.0f;
|
|
|
- IndexLookup[i] = (short)-1;
|
|
|
- }
|
|
|
+ GrowIndex(max_codepoint + 1);
|
|
|
for (int i = 0; i < Glyphs.Size; i++)
|
|
|
{
|
|
|
int codepoint = (int)Glyphs[i].Codepoint;
|
|
@@ -1720,6 +1714,36 @@ void ImFont::SetFallbackChar(ImWchar c)
|
|
|
BuildLookupTable();
|
|
|
}
|
|
|
|
|
|
+void ImFont::GrowIndex(int new_size)
|
|
|
+{
|
|
|
+ IM_ASSERT(IndexXAdvance.Size == IndexLookup.Size);
|
|
|
+ int old_size = IndexLookup.Size;
|
|
|
+ if (new_size <= old_size)
|
|
|
+ return;
|
|
|
+ IndexXAdvance.resize(new_size);
|
|
|
+ IndexLookup.resize(new_size);
|
|
|
+ for (int i = old_size; i < new_size; i++)
|
|
|
+ {
|
|
|
+ IndexXAdvance[i] = -1.0f;
|
|
|
+ IndexLookup[i] = (short)-1;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst)
|
|
|
+{
|
|
|
+ IM_ASSERT(IndexLookup.Size > 0); // Currently this can only be called AFTER the font has been built, aka after calling ImFontAtlas::GetTexDataAs*() function.
|
|
|
+ int index_size = IndexLookup.Size;
|
|
|
+
|
|
|
+ if (dst < index_size && IndexLookup.Data[dst] == -1 && !overwrite_dst) // 'dst' already exists
|
|
|
+ return;
|
|
|
+ if (src >= index_size && dst >= index_size) // both 'dst' and 'src' don't exist -> no-op
|
|
|
+ return;
|
|
|
+
|
|
|
+ GrowIndex(dst + 1);
|
|
|
+ IndexLookup[dst] = (src < index_size) ? IndexLookup.Data[src] : -1;
|
|
|
+ IndexXAdvance[dst] = (src < index_size) ? IndexXAdvance.Data[src] : 1.0f;
|
|
|
+}
|
|
|
+
|
|
|
const ImFont::Glyph* ImFont::FindGlyph(unsigned short c) const
|
|
|
{
|
|
|
if (c < IndexLookup.Size)
|