From c68456b4cb12870c5663b4013e758c5dd7d0d9b6 Mon Sep 17 00:00:00 2001 From: Stefan Schindler Date: Fri, 8 Aug 2025 08:43:54 +0200 Subject: [PATCH] refac, fix: Fix kerning; one return path When calculating text metrics, kerning did not update the previous character, so kerning -- for every character -- was always calculated from the current character to the character with charcode 0x00. Fixes #89. --- src/SFGUI/Engine.cpp | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/SFGUI/Engine.cpp b/src/SFGUI/Engine.cpp index 0e9818d0..cfee53d3 100644 --- a/src/SFGUI/Engine.cpp +++ b/src/SFGUI/Engine.cpp @@ -183,31 +183,38 @@ sf::Vector2f Engine::GetTextStringMetrics( const sf::String& string, const sf::F auto longest_line = 0.f; for( const auto& current_character : string ) { - metrics.x += static_cast( font.getKerning( previous_character, current_character, font_size ) ); - switch( current_character ) { case L' ': metrics.x += horizontal_spacing; - continue; + break; + case L'\t': metrics.x += horizontal_spacing * tab_spaces; - continue; + break; + case L'\n': metrics.y += vertical_spacing; longest_line = std::max( metrics.x, longest_line ); metrics.x = 0.f; - continue; + break; + case L'\v': metrics.y += vertical_spacing * tab_spaces; - continue; - default: break; - } - const auto& glyph = font.getGlyph( current_character, font_size, false ); + default: + if( previous_character != 0 ) { + metrics.x += static_cast( font.getKerning( previous_character, current_character, font_size ) ); + } - metrics.x += static_cast( glyph.advance ); - metrics.y = std::max( metrics.y, static_cast( glyph.bounds.size.y ) ); + previous_character = current_character; + + const auto& glyph = font.getGlyph( current_character, font_size, false ); + metrics.x += static_cast( glyph.advance ); + metrics.y = std::max( metrics.y, static_cast( glyph.bounds.size.y ) ); + + break; + } } metrics.x = std::max( longest_line, metrics.x );