|
@@ -166,6 +166,8 @@ namespace
|
|
|
unsigned int UserFlags; // = ImFontConfig::RasterizerFlags
|
|
|
FT_Int32 LoadFlags;
|
|
|
FT_Render_Mode RenderMode;
|
|
|
+ float RasterizationDensity;
|
|
|
+ float InvRasterizationDensity;
|
|
|
};
|
|
|
|
|
|
// From SDL_ttf: Handy routines for converting from fixed point
|
|
@@ -208,6 +210,9 @@ namespace
|
|
|
if (UserFlags & ImGuiFreeTypeBuilderFlags_LoadColor)
|
|
|
LoadFlags |= FT_LOAD_COLOR;
|
|
|
|
|
|
+ RasterizationDensity = cfg.RasterizerDensity;
|
|
|
+ InvRasterizationDensity = 1.0f / RasterizationDensity;
|
|
|
+
|
|
|
memset(&Info, 0, sizeof(Info));
|
|
|
SetPixelHeight((uint32_t)cfg.SizePixels);
|
|
|
|
|
@@ -231,19 +236,19 @@ namespace
|
|
|
FT_Size_RequestRec req;
|
|
|
req.type = (UserFlags & ImGuiFreeTypeBuilderFlags_Bitmap) ? FT_SIZE_REQUEST_TYPE_NOMINAL : FT_SIZE_REQUEST_TYPE_REAL_DIM;
|
|
|
req.width = 0;
|
|
|
- req.height = (uint32_t)pixel_height * 64;
|
|
|
+ req.height = (uint32_t)(pixel_height * 64 * RasterizationDensity);
|
|
|
req.horiResolution = 0;
|
|
|
req.vertResolution = 0;
|
|
|
FT_Request_Size(Face, &req);
|
|
|
|
|
|
// Update font info
|
|
|
FT_Size_Metrics metrics = Face->size->metrics;
|
|
|
- Info.PixelHeight = (uint32_t)pixel_height;
|
|
|
- Info.Ascender = (float)FT_CEIL(metrics.ascender);
|
|
|
- Info.Descender = (float)FT_CEIL(metrics.descender);
|
|
|
- Info.LineSpacing = (float)FT_CEIL(metrics.height);
|
|
|
- Info.LineGap = (float)FT_CEIL(metrics.height - metrics.ascender + metrics.descender);
|
|
|
- Info.MaxAdvanceWidth = (float)FT_CEIL(metrics.max_advance);
|
|
|
+ Info.PixelHeight = (uint32_t)(pixel_height * InvRasterizationDensity);
|
|
|
+ Info.Ascender = (float)FT_CEIL(metrics.ascender) * InvRasterizationDensity;
|
|
|
+ Info.Descender = (float)FT_CEIL(metrics.descender) * InvRasterizationDensity;
|
|
|
+ Info.LineSpacing = (float)FT_CEIL(metrics.height) * InvRasterizationDensity;
|
|
|
+ Info.LineGap = (float)FT_CEIL(metrics.height - metrics.ascender + metrics.descender) * InvRasterizationDensity;
|
|
|
+ Info.MaxAdvanceWidth = (float)FT_CEIL(metrics.max_advance) * InvRasterizationDensity;
|
|
|
}
|
|
|
|
|
|
const FT_Glyph_Metrics* FreeTypeFont::LoadGlyph(uint32_t codepoint)
|
|
@@ -695,15 +700,15 @@ bool ImFontAtlasBuildWithFreeTypeEx(FT_Library ft_library, ImFontAtlas* atlas, u
|
|
|
const int ty = pack_rect.y + padding;
|
|
|
|
|
|
// Register glyph
|
|
|
- float x0 = info.OffsetX + font_off_x;
|
|
|
- float y0 = info.OffsetY + font_off_y;
|
|
|
- float x1 = x0 + info.Width;
|
|
|
- float y1 = y0 + info.Height;
|
|
|
+ float x0 = info.OffsetX * src_tmp.Font.InvRasterizationDensity + font_off_x;
|
|
|
+ float y0 = info.OffsetY * src_tmp.Font.InvRasterizationDensity + font_off_y;
|
|
|
+ float x1 = x0 + info.Width * src_tmp.Font.InvRasterizationDensity;
|
|
|
+ float y1 = y0 + info.Height * src_tmp.Font.InvRasterizationDensity;
|
|
|
float u0 = (tx) / (float)atlas->TexWidth;
|
|
|
float v0 = (ty) / (float)atlas->TexHeight;
|
|
|
float u1 = (tx + info.Width) / (float)atlas->TexWidth;
|
|
|
float v1 = (ty + info.Height) / (float)atlas->TexHeight;
|
|
|
- dst_font->AddGlyph(&cfg, (ImWchar)src_glyph.Codepoint, x0, y0, x1, y1, u0, v0, u1, v1, info.AdvanceX);
|
|
|
+ dst_font->AddGlyph(&cfg, (ImWchar)src_glyph.Codepoint, x0, y0, x1, y1, u0, v0, u1, v1, info.AdvanceX * src_tmp.Font.InvRasterizationDensity);
|
|
|
|
|
|
ImFontGlyph* dst_glyph = &dst_font->Glyphs.back();
|
|
|
IM_ASSERT(dst_glyph->Codepoint == src_glyph.Codepoint);
|