1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-09-20 04:24:48 +00:00

Fix mono-mode font rendering issues + some quality of life changes

This commit is contained in:
Samuel Gomes 2024-04-17 21:48:32 +05:30
parent 8514e46034
commit e2fdae332b

View file

@ -324,7 +324,7 @@ struct FontManager {
}
// Load the mono glyph to query details and render
if (FT_Load_Glyph(parentFont->face, index, FT_LOAD_DEFAULT)) {
if (FT_Load_Glyph(parentFont->face, index, FT_LOAD_TARGET_MONO)) {
FONT_DEBUG_PRINT("Failed to load mono glyph for codepoint %lu (%u)", codepoint, index);
}
@ -821,24 +821,26 @@ int32_t FontLoad(const uint8_t *content_original, int32_t content_bytes, int32_t
(double)default_pixel_height);
fontManager.fonts[h]->options = options; // save the options for use later
if (options & FONT_LOAD_MONOSPACE) {
// Get the width of upper case W
if (FT_Load_Char(fontManager.fonts[h]->face, 'W', FT_LOAD_DEFAULT)) {
FONT_DEBUG_PRINT("FT_Load_Char() 'W' failed");
}
fontManager.fonts[h]->monospaceWidth =
std::max(fontManager.fonts[h]->face->glyph->advance.x / 64, (FT_Pos)fontManager.fonts[h]->face->glyph->bitmap.width); // save the width
if ((options & FONT_LOAD_MONOSPACE) || FT_IS_FIXED_WIDTH(fontManager.fonts[h]->face)) {
const auto testCP = 'W'; // since W is usually the widest
// Get the width of upper case M
if (FT_Load_Char(fontManager.fonts[h]->face, 'M', FT_LOAD_DEFAULT)) {
FONT_DEBUG_PRINT("FT_Load_Char() 'M' failed");
// Load using monochrome rendering
if (FT_Load_Char(fontManager.fonts[h]->face, testCP, FT_LOAD_RENDER | FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO)) {
FONT_DEBUG_PRINT("FT_Load_Char() (monochrome) failed");
// Retry using gray-level rendering
if (FT_Load_Char(fontManager.fonts[h]->face, testCP, FT_LOAD_RENDER)) {
FONT_DEBUG_PRINT("FT_Load_Char() (gray) failed");
}
}
if (fontManager.fonts[h]->face->glyph) {
fontManager.fonts[h]->monospaceWidth =
std::max(fontManager.fonts[h]->monospaceWidth, std::max(fontManager.fonts[h]->face->glyph->advance.x / 64,
(FT_Pos)fontManager.fonts[h]->face->glyph->bitmap.width)); // save the max width
std::max(fontManager.fonts[h]->face->glyph->advance.x / 64, (FT_Pos)fontManager.fonts[h]->face->glyph->bitmap.width); // save the max width
FONT_DEBUG_PRINT("Monospace font (width = %li) requested", fontManager.fonts[h]->monospaceWidth);
}
}
FONT_DEBUG_PRINT("Font (height = %i, index = %i) successfully initialized", default_pixel_height, which_font);
return h;