ImFontAtlas: Re-arranging code to simplify implementation of imgui_freetype. (#618)

This commit is contained in:
omar 2017-08-17 21:13:14 +08:00
parent 4075cc58e9
commit 1086c87767
2 changed files with 29 additions and 18 deletions

View File

@ -1477,20 +1477,9 @@ bool ImFontAtlas::Build()
float ascent = unscaled_ascent * font_scale; float ascent = unscaled_ascent * font_scale;
float descent = unscaled_descent * font_scale; float descent = unscaled_descent * font_scale;
if (!cfg.MergeMode) ImFontAtlasBuildSetupFont(this, dst_font, &cfg, ascent, descent);
{
dst_font->ContainerAtlas = this;
dst_font->ConfigData = &cfg;
dst_font->ConfigDataCount = 0;
dst_font->FontSize = cfg.SizePixels;
dst_font->Ascent = ascent;
dst_font->Descent = descent;
dst_font->Glyphs.resize(0);
dst_font->MetricsTotalSurface = 0;
}
dst_font->ConfigDataCount++;
float off_x = cfg.GlyphOffset.x; float off_x = cfg.GlyphOffset.x;
float off_y = cfg.GlyphOffset.y; float off_y = cfg.GlyphOffset.y + (float)(int)(dst_font->Ascent + 0.5f);
dst_font->FallbackGlyph = NULL; // Always clear fallback so FindGlyph can return NULL. It will be set again in BuildLookupTable() dst_font->FallbackGlyph = NULL; // Always clear fallback so FindGlyph can return NULL. It will be set again in BuildLookupTable()
for (int i = 0; i < tmp.RangesCount; i++) for (int i = 0; i < tmp.RangesCount; i++)
@ -1513,11 +1502,16 @@ bool ImFontAtlas::Build()
dst_font->Glyphs.resize(dst_font->Glyphs.Size + 1); dst_font->Glyphs.resize(dst_font->Glyphs.Size + 1);
ImFont::Glyph& glyph = dst_font->Glyphs.back(); ImFont::Glyph& glyph = dst_font->Glyphs.back();
glyph.Codepoint = (ImWchar)codepoint; 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.X0 = q.x0 + off_x;
glyph.U0 = q.s0; glyph.V0 = q.t0; glyph.U1 = q.s1; glyph.V1 = q.t1; glyph.Y0 = q.y0 + off_y;
glyph.Y0 += (float)(int)(dst_font->Ascent + 0.5f); glyph.X1 = q.x1 + off_x;
glyph.Y1 += (float)(int)(dst_font->Ascent + 0.5f); 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 glyph.XAdvance = (pc.xadvance + cfg.GlyphExtraSpacing.x); // Bake spacing into XAdvance
if (cfg.PixelSnapH) if (cfg.PixelSnapH)
glyph.XAdvance = (float)(int)(glyph.XAdvance + 0.5f); glyph.XAdvance = (float)(int)(glyph.XAdvance + 0.5f);
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 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)
atlas->CustomRectRegister(FONT_ATLAS_DEFAULT_TEX_DATA_ID, FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF*2+1, FONT_ATLAS_DEFAULT_TEX_DATA_H); atlas->CustomRectRegister(FONT_ATLAS_DEFAULT_TEX_DATA_ID, FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF*2+1, FONT_ATLAS_DEFAULT_TEX_DATA_H);
} }
void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent)
{
if (!font_config->MergeMode)
{
font->ContainerAtlas = atlas;
font->ConfigData = font_config;
font->ConfigDataCount = 0;
font->FontSize = font_config->SizePixels;
font->Ascent = ascent;
font->Descent = descent;
font->Glyphs.resize(0);
font->MetricsTotalSurface = 0;
}
font->ConfigDataCount++;
}
void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* pack_context_opaque) void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* pack_context_opaque)
{ {
stbrp_context* pack_context = (stbrp_context*)pack_context_opaque; stbrp_context* pack_context = (stbrp_context*)pack_context_opaque;

View File

@ -792,8 +792,9 @@ namespace ImGui
} // namespace ImGui } // namespace ImGui
// ImFontAtlas // ImFontAtlas internals
IMGUI_API void ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas); IMGUI_API void ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas);
IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent);
IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* spc); IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* spc);
IMGUI_API void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas); IMGUI_API void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas);