Skip to content

Commit 8bbb46b

Browse files
committed
Merge branch 'frankfontaine' into 'master'
Properly implement bitmap font kerning (#8378) See merge request OpenMW/openmw!4565
2 parents 8884150 + fd35839 commit 8bbb46b

File tree

1 file changed

+31
-58
lines changed

1 file changed

+31
-58
lines changed

components/fontloader/fontloader.cpp

+31-58
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,8 @@ namespace Gui
363363
Point bottom_right;
364364
float width;
365365
float height;
366-
float u2; // appears unused, always 0
367-
float kerning;
366+
float kerningLeft;
367+
float kerningRight;
368368
float ascent;
369369
} GlyphInfo;
370370

@@ -570,6 +570,12 @@ namespace Gui
570570
additional.emplace(69, 0x0401); // Ё (Cyrillic Capital Letter Io) => E (latin capital E)
571571
additional.emplace(137, 0x0451); // ё (Cyrillic Small Letter Io) => ë (latin small E-diaeresis)
572572

573+
// ASCII vertical bar, use this as text input cursor
574+
additional.emplace(124, MyGUI::FontCodeType::Cursor);
575+
576+
// Underscore, use for NotDefined marker (used for glyphs not existing in the font)
577+
additional.emplace(95, MyGUI::FontCodeType::NotDefined);
578+
573579
for (int i = 0; i < 256; i++)
574580
{
575581
float x1 = data[i].top_left.x * width;
@@ -579,64 +585,31 @@ namespace Gui
579585

580586
ToUTF8::Utf8Encoder encoder(mEncoding);
581587
unsigned long unicodeVal = getUnicode(i, encoder, mEncoding);
588+
const std::string coord = MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " "
589+
+ MyGUI::utility::toString(w) + " " + MyGUI::utility::toString(h);
590+
float advance = data[i].width + data[i].kerningRight;
591+
// Yes MyGUI, we really do want an advance of 0 sometimes, thank you.
592+
if (advance == 0.f && data[i].width != 0.f)
593+
advance = std::numeric_limits<float>::min();
594+
const std::string bearing = MyGUI::utility::toString(data[i].kerningLeft) + ' '
595+
+ MyGUI::utility::toString((fontSize - data[i].ascent));
596+
const MyGUI::IntSize size(static_cast<int>(data[i].width), static_cast<int>(data[i].height));
582597

583598
MyGUI::xml::ElementPtr code = codes->createChild("Code");
584599
code->addAttribute("index", unicodeVal);
585-
code->addAttribute("coord",
586-
MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " " + MyGUI::utility::toString(w)
587-
+ " " + MyGUI::utility::toString(h));
588-
code->addAttribute("advance", data[i].width);
589-
code->addAttribute("bearing",
590-
MyGUI::utility::toString(data[i].kerning) + " "
591-
+ MyGUI::utility::toString((fontSize - data[i].ascent)));
592-
code->addAttribute(
593-
"size", MyGUI::IntSize(static_cast<int>(data[i].width), static_cast<int>(data[i].height)));
600+
code->addAttribute("coord", coord);
601+
code->addAttribute("advance", advance);
602+
code->addAttribute("bearing", bearing);
603+
code->addAttribute("size", size);
594604

595605
for (auto [it, end] = additional.equal_range(i); it != end; ++it)
596606
{
597607
code = codes->createChild("Code");
598608
code->addAttribute("index", it->second);
599-
code->addAttribute("coord",
600-
MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " "
601-
+ MyGUI::utility::toString(w) + " " + MyGUI::utility::toString(h));
602-
code->addAttribute("advance", data[i].width);
603-
code->addAttribute("bearing",
604-
MyGUI::utility::toString(data[i].kerning) + " "
605-
+ MyGUI::utility::toString((fontSize - data[i].ascent)));
606-
code->addAttribute(
607-
"size", MyGUI::IntSize(static_cast<int>(data[i].width), static_cast<int>(data[i].height)));
608-
}
609-
610-
// ASCII vertical bar, use this as text input cursor
611-
if (i == 124)
612-
{
613-
MyGUI::xml::ElementPtr cursorCode = codes->createChild("Code");
614-
cursorCode->addAttribute("index", MyGUI::FontCodeType::Cursor);
615-
cursorCode->addAttribute("coord",
616-
MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " "
617-
+ MyGUI::utility::toString(w) + " " + MyGUI::utility::toString(h));
618-
cursorCode->addAttribute("advance", data[i].width);
619-
cursorCode->addAttribute("bearing",
620-
MyGUI::utility::toString(data[i].kerning) + " "
621-
+ MyGUI::utility::toString((fontSize - data[i].ascent)));
622-
cursorCode->addAttribute(
623-
"size", MyGUI::IntSize(static_cast<int>(data[i].width), static_cast<int>(data[i].height)));
624-
}
625-
626-
// Underscore, use for NotDefined marker (used for glyphs not existing in the font)
627-
if (i == 95)
628-
{
629-
MyGUI::xml::ElementPtr cursorCode = codes->createChild("Code");
630-
cursorCode->addAttribute("index", MyGUI::FontCodeType::NotDefined);
631-
cursorCode->addAttribute("coord",
632-
MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " "
633-
+ MyGUI::utility::toString(w) + " " + MyGUI::utility::toString(h));
634-
cursorCode->addAttribute("advance", data[i].width);
635-
cursorCode->addAttribute("bearing",
636-
MyGUI::utility::toString(data[i].kerning) + " "
637-
+ MyGUI::utility::toString((fontSize - data[i].ascent)));
638-
cursorCode->addAttribute(
639-
"size", MyGUI::IntSize(static_cast<int>(data[i].width), static_cast<int>(data[i].height)));
609+
code->addAttribute("coord", coord);
610+
code->addAttribute("advance", advance);
611+
code->addAttribute("bearing", bearing);
612+
code->addAttribute("size", size);
640613
}
641614
}
642615

@@ -645,12 +618,12 @@ namespace Gui
645618
omitted.push_back(MyGUI::FontCodeType::SelectedBack);
646619
for (const UnicodeIndex index : omitted)
647620
{
648-
MyGUI::xml::ElementPtr cursorCode = codes->createChild("Code");
649-
cursorCode->addAttribute("index", index);
650-
cursorCode->addAttribute("coord", "0 0 0 0");
651-
cursorCode->addAttribute("advance", "0");
652-
cursorCode->addAttribute("bearing", "0 0");
653-
cursorCode->addAttribute("size", "0 0");
621+
MyGUI::xml::ElementPtr code = codes->createChild("Code");
622+
code->addAttribute("index", index);
623+
code->addAttribute("coord", "0 0 0 0");
624+
code->addAttribute("advance", "0");
625+
code->addAttribute("bearing", "0 0");
626+
code->addAttribute("size", "0 0");
654627
}
655628

656629
// Register the font with MyGUI

0 commit comments

Comments
 (0)