Skip to content

Commit 1086c87

Browse files
committed
ImFontAtlas: Re-arranging code to simplify implementation of imgui_freetype. (#618)
1 parent 4075cc5 commit 1086c87

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

imgui_draw.cpp

+27-17
Original file line numberDiff line numberDiff line change
@@ -1477,20 +1477,9 @@ bool ImFontAtlas::Build()
14771477

14781478
float ascent = unscaled_ascent * font_scale;
14791479
float descent = unscaled_descent * font_scale;
1480-
if (!cfg.MergeMode)
1481-
{
1482-
dst_font->ContainerAtlas = this;
1483-
dst_font->ConfigData = &cfg;
1484-
dst_font->ConfigDataCount = 0;
1485-
dst_font->FontSize = cfg.SizePixels;
1486-
dst_font->Ascent = ascent;
1487-
dst_font->Descent = descent;
1488-
dst_font->Glyphs.resize(0);
1489-
dst_font->MetricsTotalSurface = 0;
1490-
}
1491-
dst_font->ConfigDataCount++;
1480+
ImFontAtlasBuildSetupFont(this, dst_font, &cfg, ascent, descent);
14921481
float off_x = cfg.GlyphOffset.x;
1493-
float off_y = cfg.GlyphOffset.y;
1482+
float off_y = cfg.GlyphOffset.y + (float)(int)(dst_font->Ascent + 0.5f);
14941483

14951484
dst_font->FallbackGlyph = NULL; // Always clear fallback so FindGlyph can return NULL. It will be set again in BuildLookupTable()
14961485
for (int i = 0; i < tmp.RangesCount; i++)
@@ -1513,11 +1502,16 @@ bool ImFontAtlas::Build()
15131502
dst_font->Glyphs.resize(dst_font->Glyphs.Size + 1);
15141503
ImFont::Glyph& glyph = dst_font->Glyphs.back();
15151504
glyph.Codepoint = (ImWchar)codepoint;
1516-
glyph.X0 = q.x0 + off_x; glyph.Y0 = q.y0 + off_y; glyph.X1 = q.x1 + off_x; glyph.Y1 = q.y1 + off_y;
1517-
glyph.U0 = q.s0; glyph.V0 = q.t0; glyph.U1 = q.s1; glyph.V1 = q.t1;
1518-
glyph.Y0 += (float)(int)(dst_font->Ascent + 0.5f);
1519-
glyph.Y1 += (float)(int)(dst_font->Ascent + 0.5f);
1505+
glyph.X0 = q.x0 + off_x;
1506+
glyph.Y0 = q.y0 + off_y;
1507+
glyph.X1 = q.x1 + off_x;
1508+
glyph.Y1 = q.y1 + off_y;
1509+
glyph.U0 = q.s0;
1510+
glyph.V0 = q.t0;
1511+
glyph.U1 = q.s1;
1512+
glyph.V1 = q.t1;
15201513
glyph.XAdvance = (pc.xadvance + cfg.GlyphExtraSpacing.x); // Bake spacing into XAdvance
1514+
15211515
if (cfg.PixelSnapH)
15221516
glyph.XAdvance = (float)(int)(glyph.XAdvance + 0.5f);
15231517
dst_font->MetricsTotalSurface += (int)((glyph.U1 - glyph.U0) * TexWidth + 1.99f) * (int)((glyph.V1 - glyph.V0) * TexHeight + 1.99f); // +1 to account for average padding, +0.99 to round
@@ -1544,6 +1538,22 @@ void ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas)
15441538
atlas->CustomRectRegister(FONT_ATLAS_DEFAULT_TEX_DATA_ID, FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF*2+1, FONT_ATLAS_DEFAULT_TEX_DATA_H);
15451539
}
15461540

1541+
void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent)
1542+
{
1543+
if (!font_config->MergeMode)
1544+
{
1545+
font->ContainerAtlas = atlas;
1546+
font->ConfigData = font_config;
1547+
font->ConfigDataCount = 0;
1548+
font->FontSize = font_config->SizePixels;
1549+
font->Ascent = ascent;
1550+
font->Descent = descent;
1551+
font->Glyphs.resize(0);
1552+
font->MetricsTotalSurface = 0;
1553+
}
1554+
font->ConfigDataCount++;
1555+
}
1556+
15471557
void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* pack_context_opaque)
15481558
{
15491559
stbrp_context* pack_context = (stbrp_context*)pack_context_opaque;

imgui_internal.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -792,8 +792,9 @@ namespace ImGui
792792

793793
} // namespace ImGui
794794

795-
// ImFontAtlas
795+
// ImFontAtlas internals
796796
IMGUI_API void ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas);
797+
IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent);
797798
IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* spc);
798799
IMGUI_API void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas);
799800

0 commit comments

Comments
 (0)