mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-13 18:50:58 +01:00
ImFont: Split some building code into a AddGlyph() helper (that custom rect code and imgui_freetype can use)
This commit is contained in:
parent
be03882a15
commit
529ca279a4
5
imgui.h
5
imgui.h
@ -1387,7 +1387,7 @@ struct ImFontAtlas
|
|||||||
IMGUI_API const ImWchar* GetGlyphRangesCyrillic(); // Default + about 400 Cyrillic characters
|
IMGUI_API const ImWchar* GetGlyphRangesCyrillic(); // Default + about 400 Cyrillic characters
|
||||||
IMGUI_API const ImWchar* GetGlyphRangesThai(); // Default + Thai characters
|
IMGUI_API const ImWchar* GetGlyphRangesThai(); // Default + Thai characters
|
||||||
|
|
||||||
// Helpers to build glyph ranges from text data. Feed all your application strings/characters to it then call BuildRanges().
|
// Helpers to build glyph ranges from text data. Feed your application strings/characters to it then call BuildRanges().
|
||||||
struct GlyphRangesBuilder
|
struct GlyphRangesBuilder
|
||||||
{
|
{
|
||||||
ImVector<unsigned char> UsedChars; // Store 1-bit per Unicode code point (0=unused, 1=used)
|
ImVector<unsigned char> UsedChars; // Store 1-bit per Unicode code point (0=unused, 1=used)
|
||||||
@ -1477,8 +1477,9 @@ struct ImFont
|
|||||||
IMGUI_API void RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, unsigned short c) const;
|
IMGUI_API void RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, unsigned short c) const;
|
||||||
IMGUI_API void RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false) const;
|
IMGUI_API void RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false) const;
|
||||||
|
|
||||||
// Private
|
// [Private]
|
||||||
IMGUI_API void GrowIndex(int new_size);
|
IMGUI_API void GrowIndex(int new_size);
|
||||||
|
IMGUI_API void AddGlyph(ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float x_advance);
|
||||||
IMGUI_API void AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built.
|
IMGUI_API void AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1535,23 +1535,7 @@ bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
|
|||||||
stbtt_aligned_quad q;
|
stbtt_aligned_quad q;
|
||||||
float dummy_x = 0.0f, dummy_y = 0.0f;
|
float dummy_x = 0.0f, dummy_y = 0.0f;
|
||||||
stbtt_GetPackedQuad(range.chardata_for_range, atlas->TexWidth, atlas->TexHeight, char_idx, &dummy_x, &dummy_y, &q, 0);
|
stbtt_GetPackedQuad(range.chardata_for_range, atlas->TexWidth, atlas->TexHeight, char_idx, &dummy_x, &dummy_y, &q, 0);
|
||||||
|
dst_font->AddGlyph((ImWchar)codepoint, q.x0 + off_x, q.y0 + off_y, q.x1 + off_x, q.y1 + off_y, q.s0, q.t0, q.s1, q.t1, pc.xadvance);
|
||||||
dst_font->Glyphs.resize(dst_font->Glyphs.Size + 1);
|
|
||||||
ImFont::Glyph& glyph = dst_font->Glyphs.back();
|
|
||||||
glyph.Codepoint = (ImWchar)codepoint;
|
|
||||||
glyph.X0 = q.x0 + off_x;
|
|
||||||
glyph.Y0 = q.y0 + off_y;
|
|
||||||
glyph.X1 = q.x1 + off_x;
|
|
||||||
glyph.Y1 = q.y1 + off_y;
|
|
||||||
glyph.U0 = q.s0;
|
|
||||||
glyph.V0 = q.t0;
|
|
||||||
glyph.U1 = q.s1;
|
|
||||||
glyph.V1 = q.t1;
|
|
||||||
glyph.XAdvance = (pc.xadvance + cfg.GlyphExtraSpacing.x); // Bake spacing into XAdvance
|
|
||||||
|
|
||||||
if (cfg.PixelSnapH)
|
|
||||||
glyph.XAdvance = (float)(int)(glyph.XAdvance + 0.5f);
|
|
||||||
dst_font->MetricsTotalSurface += (int)((glyph.U1 - glyph.U0) * atlas->TexWidth + 1.99f) * (int)((glyph.V1 - glyph.V0) * atlas->TexHeight + 1.99f); // +1 to account for average padding, +0.99 to round
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cfg.DstFont->BuildLookupTable();
|
cfg.DstFont->BuildLookupTable();
|
||||||
@ -1923,6 +1907,28 @@ void ImFont::GrowIndex(int new_size)
|
|||||||
IndexLookup.resize(new_size, (unsigned short)-1);
|
IndexLookup.resize(new_size, (unsigned short)-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImFont::AddGlyph(ImWchar codepoint, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float x_advance)
|
||||||
|
{
|
||||||
|
Glyphs.resize(Glyphs.Size + 1);
|
||||||
|
ImFont::Glyph& glyph = Glyphs.back();
|
||||||
|
glyph.Codepoint = (ImWchar)codepoint;
|
||||||
|
glyph.X0 = x0;
|
||||||
|
glyph.Y0 = y0;
|
||||||
|
glyph.X1 = x1;
|
||||||
|
glyph.Y1 = y1;
|
||||||
|
glyph.U0 = u0;
|
||||||
|
glyph.V0 = v0;
|
||||||
|
glyph.U1 = u1;
|
||||||
|
glyph.V1 = v1;
|
||||||
|
glyph.XAdvance = (x_advance + ConfigData->GlyphExtraSpacing.x); // Bake spacing into XAdvance
|
||||||
|
|
||||||
|
if (ConfigData->PixelSnapH)
|
||||||
|
glyph.XAdvance = (float)(int)(glyph.XAdvance + 0.5f);
|
||||||
|
|
||||||
|
// Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round)
|
||||||
|
MetricsTotalSurface += (int)((glyph.U1 - glyph.U0) * ContainerAtlas->TexWidth + 1.99f) * (int)((glyph.V1 - glyph.V0) * ContainerAtlas->TexHeight + 1.99f);
|
||||||
|
}
|
||||||
|
|
||||||
void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst)
|
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.
|
IM_ASSERT(IndexLookup.Size > 0); // Currently this can only be called AFTER the font has been built, aka after calling ImFontAtlas::GetTexDataAs*() function.
|
||||||
|
Loading…
Reference in New Issue
Block a user