From fa5c6017f741db3f244273418e47e1d853505335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sun, 26 Oct 2025 21:29:50 -0300 Subject: [PATCH 1/8] WIP text shaping refactor. --- .ecode/project_build.json | 2 +- include/eepp/graphics/text.hpp | 67 +++++ src/eepp/graphics/text.cpp | 467 ++++++++++++++++++++------------- 3 files changed, 347 insertions(+), 189 deletions(-) diff --git a/.ecode/project_build.json b/.ecode/project_build.json index 71d8165c1..8550b92ec 100644 --- a/.ecode/project_build.json +++ b/.ecode/project_build.json @@ -204,7 +204,7 @@ }, "run": [ { - "args": "", + "args": "--text-shaper", "command": "${project_root}/bin/ecode-debug", "name": "ecode-debug", "working_dir": "${project_root}/bin" diff --git a/include/eepp/graphics/text.hpp b/include/eepp/graphics/text.hpp index a6b6e3c9f..271dbfc89 100644 --- a/include/eepp/graphics/text.hpp +++ b/include/eepp/graphics/text.hpp @@ -10,6 +10,8 @@ namespace EE { namespace Graphics { +class FontTrueType; + enum class CharacterAlignment : Uint32 { Left = 0, Center = 1, Right = 2 }; struct WhitespaceDisplayConfig { @@ -20,6 +22,71 @@ struct WhitespaceDisplayConfig { std::optional tabOffset; }; +struct ShapedGlyph { + Uint32 glyphIndex{ 0 }; + size_t stringIndex{ 0 }; + Vector2f position; +}; + +struct TextLayout { + std::vector shapedGlyphs; + std::vector linesWidth; + Sizef size; +}; + +class EE_API TextLayouter { + public: + static TextLayout layout( const String& string, Font* font, const Uint32& fontSize, + const Uint32& style, const Uint32& tabWidth = 4, + const Float& outlineThickness = 0.f, + std::optional tabOffset = {}, Uint32 textDrawHints = 0 ); + + static TextLayout layout( const String::View& string, Font* font, const Uint32& fontSize, + const Uint32& style, const Uint32& tabWidth = 4, + const Float& outlineThickness = 0.f, + std::optional tabOffset = {}, Uint32 textDrawHints = 0 ); + + protected: + template + static TextLayout layout( const StringType& string, Font* font, const Uint32& fontSize, + const Uint32& style, const Uint32& tabWidth = 4, + const Float& outlineThickness = 0.f, + std::optional tabOffset = {}, Uint32 textDrawHints = 0 ); +}; + +// helper class that divides the string into lines and font runs. +class EE_API TextShapeRun { + public: + TextShapeRun( String::View str, FontTrueType* font, Uint32 characterSize, Uint32 style, + Float outlineThickness ); + + String::View curRun() const; + + bool hasNext() const; + + std::size_t pos() const; + + void next(); + + bool runIsNewLine() const; + + FontTrueType* font(); + + protected: + void findNextEnd(); + + String::View mString; + std::size_t mIndex{ 0 }; + std::size_t mLen{ 0 }; + Font* mFont{ nullptr }; + Uint32 mCharacterSize; + Uint32 mStyle; + Float mOutlineThickness; + Font* mCurFont{ nullptr }; + Font* mStartFont{ nullptr }; + bool mIsNewLine{ false }; +}; + class EE_API Text { public: static bool TextShaperEnabled; diff --git a/src/eepp/graphics/text.cpp b/src/eepp/graphics/text.cpp index 4fc933dce..f874267ea 100644 --- a/src/eepp/graphics/text.cpp +++ b/src/eepp/graphics/text.cpp @@ -19,75 +19,6 @@ namespace EE { namespace Graphics { -namespace { - -// helper class that divides the string into lines and font runs. -class TextShapeRun { - public: - TextShapeRun( String::View str, FontTrueType* font, Uint32 characterSize, Uint32 style, - Float outlineThickness ) : - mString( str ), - mFont( font ), - mCharacterSize( characterSize ), - mStyle( style ), - mOutlineThickness( outlineThickness ), - mCurFont( mFont ) { - findNextEnd(); - } - - std::size_t curRunStart() { return mIndex; } - - String::View curRun() const { return mString.substr( mIndex, mIsNewLine ? mLen - 1 : mLen ); } - - bool hasNext() const { return mIndex < mString.size(); } - - std::size_t pos() const { return mIndex; } - - void next() { - mIndex += mLen; - findNextEnd(); - } - - bool runIsNewLine() const { return mIsNewLine; } - - FontTrueType* font() { return static_cast( mCurFont ); } - - private: - void findNextEnd() { - Font* lFont = mStartFont; - std::size_t len = mString.size(); - std::size_t idx; - std::size_t pos = 0; - for ( idx = mIndex; idx < len; idx++, pos++ ) { - Font* font = mFont - ->getGlyph( mString[idx], mCharacterSize, mStyle & Text::Bold, - mStyle & Text::Italic, mOutlineThickness ) - .font; - mIsNewLine = mString[idx] == '\n'; - if ( mIsNewLine || ( lFont != nullptr && font != lFont ) ) { - mCurFont = lFont; - mStartFont = font; - mLen = mIsNewLine ? pos + 1 : pos; - return; - } - lFont = font; - mCurFont = font; - } - mLen = idx; - } - - String::View mString; - std::size_t mIndex{ 0 }; - std::size_t mLen{ 0 }; - Font* mFont{ nullptr }; - Uint32 mCharacterSize; - Uint32 mStyle; - Float mOutlineThickness; - Font* mCurFont{ nullptr }; - Font* mStartFont{ nullptr }; - bool mIsNewLine{ false }; -}; - #ifdef EE_TEXT_SHAPER_ENABLED static bool shapeAndRun( const String& string, FontTrueType* font, Uint32 characterSize, Uint32 style, @@ -161,10 +92,224 @@ shapeAndRun( const String& string, const FontStyleConfig& config, return shapeAndRun( string, static_cast( config.Font ), config.CharacterSize, config.Style, config.OutlineThickness, cb ); } - #endif -} // namespace +template +TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uint32& characterSize, + const Uint32& style, const Uint32& tabWidth, + const Float& outlineThickness, std::optional tabOffset, + Uint32 textDrawHints ) { + TextLayout result; + + if ( !font || string.empty() ) { + result.size = { 0.f, font ? (Float)font->getFontHeight( characterSize ) : 0.f }; + return result; + } + + bool bold = ( style & Text::Bold ) != 0; + bool italic = ( style & Text::Italic ) != 0; + Float hspace = font->getGlyph( ' ', characterSize, bold, italic, outlineThickness ).advance; + Float vspace = font->getLineSpacing( characterSize ); + Vector2f pen; + Float maxWidth = 0; + +#ifdef EE_TEXT_SHAPER_ENABLED + if ( Text::TextShaperEnabled && font->getType() == FontType::TTF ) { + FontTrueType* ttfFont = static_cast( font ); + shapeAndRun( + string, ttfFont, characterSize, style, outlineThickness, + [&]( hb_glyph_info_t* glyphInfo, hb_glyph_position_t* glyphPos, Uint32 glyphCount, + const hb_segment_properties_t& props, TextShapeRun& run ) { + bool isRTL = HB_DIRECTION_IS_HORIZONTAL( props.direction ) && + props.direction == HB_DIRECTION_RTL; + FontTrueType* currentFont = run.font(); + if ( !currentFont ) + return true; + result.shapedGlyphs.reserve( glyphCount ); + + if ( isRTL ) { // For RTL, we trust HarfBuzz positioning completely + for ( size_t i = 0; i < glyphCount; ++i ) { + ShapedGlyph sg; + sg.glyphIndex = glyphInfo[i].codepoint; + sg.stringIndex = run.pos() + glyphInfo[i].cluster; + sg.position.x = pen.x + ( glyphPos[i].x_offset / 64.f ); + sg.position.y = pen.y - ( glyphPos[i].y_offset / 64.f ); + result.shapedGlyphs.emplace_back( std::move( sg ) ); + pen.x += glyphPos[i].x_advance / 64.f; + pen.y += glyphPos[i].y_advance / 64.f; + } + } else { // For LTR, we use our custom kerning + Uint32 prevGlyphIndex = 0; + Uint32 cluster = 0; + String::StringBaseType ch; + + for ( size_t i = 0; i < glyphCount; ++i ) { + cluster = glyphInfo[i].cluster; + ch = string[run.pos() + cluster]; + if ( ch == '\t' ) { + Float advance = Text::tabAdvance( hspace, tabWidth, + tabOffset ? pen.x + *tabOffset + : std::optional{} ); + + ShapedGlyph sg; + sg.glyphIndex = glyphInfo[i].codepoint; + sg.stringIndex = run.pos() + cluster; + sg.position = pen; + result.shapedGlyphs.emplace_back( std::move( sg ) ); + + prevGlyphIndex = glyphInfo[i].codepoint; + pen.x += advance; + continue; + } + pen.x += ttfFont->getKerningFromGlyphIndex( + prevGlyphIndex, glyphInfo[i].codepoint, characterSize, bold, italic, + outlineThickness ); + ShapedGlyph sg; + sg.glyphIndex = glyphInfo[i].codepoint; + sg.stringIndex = run.pos() + cluster; + sg.position = pen; + result.shapedGlyphs.emplace_back( std::move( sg ) ); + Glyph glyph = ttfFont->getGlyphByIndex( + glyphInfo[i].codepoint, characterSize, bold, italic, outlineThickness ); + pen.x += glyph.advance; + prevGlyphIndex = glyphInfo[i].codepoint; + } + } + + if ( run.runIsNewLine() ) { + result.linesWidth.push_back( pen.x ); + maxWidth = eemax( maxWidth, pen.x ); + pen.x = 0; + pen.y += vspace; + } + return true; + } ); + } else +#endif + { + // Fallback for non-TrueType fonts or when shaper is disabled + Uint32 prevChar = 0; + for ( size_t i = 0; i < string.size(); ++i ) { + Uint32 curChar = string[i]; + if ( curChar == '\n' ) { + result.linesWidth.push_back( pen.x ); + maxWidth = eemax( maxWidth, pen.x ); + pen.x = 0; + pen.y += vspace; + prevChar = 0; + continue; + } + if ( curChar == '\r' ) { + prevChar = curChar; + continue; + } + + pen.x += font->getKerning( prevChar, curChar, characterSize, bold, italic, + outlineThickness ); + prevChar = curChar; + + if ( curChar == '\t' ) { + pen.x += Text::tabAdvance( + hspace, tabWidth, + tabOffset ? ( tabOffset ? *tabOffset + pen.x : std::optional{} ) + : std::optional{} ); + ShapedGlyph sg; + sg.stringIndex = i; + sg.position = pen; + result.shapedGlyphs.emplace_back( std::move( sg ) ); + continue; + } + + ShapedGlyph sg; + sg.stringIndex = i; + sg.position = pen; + pen.x += + font->getGlyph( curChar, characterSize, bold, italic, outlineThickness ).advance; + result.shapedGlyphs.emplace_back( std::move( sg ) ); + } + } + + result.linesWidth.push_back( pen.x ); + maxWidth = eemax( maxWidth, pen.x ); + result.size = { maxWidth, pen.y + vspace }; + + return result; +} + +TextLayout TextLayouter::layout( const String& string, Font* font, const Uint32& fontSize, + const Uint32& style, const Uint32& tabWidth, + const Float& outlineThickness, std::optional tabOffset, + Uint32 textDrawHints ) { + return TextLayouter::layout( string, font, fontSize, style, tabWidth, outlineThickness, + tabOffset, textDrawHints ); +} + +TextLayout TextLayouter::layout( const String::View& string, Font* font, const Uint32& fontSize, + const Uint32& style, const Uint32& tabWidth, + const Float& outlineThickness, std::optional tabOffset, + Uint32 textDrawHints ) { + return TextLayouter::layout( string, font, fontSize, style, tabWidth, + outlineThickness, tabOffset, textDrawHints ); +} + +TextShapeRun::TextShapeRun( String::View str, FontTrueType* font, Uint32 characterSize, + Uint32 style, Float outlineThickness ) : + mString( str ), + mFont( font ), + mCharacterSize( characterSize ), + mStyle( style ), + mOutlineThickness( outlineThickness ), + mCurFont( mFont ) { + findNextEnd(); +} + +String::View TextShapeRun::curRun() const { + return mString.substr( mIndex, mIsNewLine ? mLen - 1 : mLen ); +} + +bool TextShapeRun::hasNext() const { + return mIndex < mString.size(); +} + +std::size_t TextShapeRun::pos() const { + return mIndex; +} + +void TextShapeRun::next() { + mIndex += mLen; + findNextEnd(); +} + +bool TextShapeRun::runIsNewLine() const { + return mIsNewLine; +} + +FontTrueType* TextShapeRun::font() { + return static_cast( mCurFont ); +} + +void TextShapeRun::findNextEnd() { + Font* lFont = mStartFont; + std::size_t len = mString.size(); + std::size_t idx; + std::size_t pos = 0; + for ( idx = mIndex; idx < len; idx++, pos++ ) { + Font* font = mFont + ->getGlyph( mString[idx], mCharacterSize, mStyle & Text::Bold, + mStyle & Text::Italic, mOutlineThickness ) + .font; + mIsNewLine = mString[idx] == '\n'; + if ( mIsNewLine || ( lFont != nullptr && font != lFont ) ) { + mCurFont = lFont; + mStartFont = font; + mLen = mIsNewLine ? pos + 1 : pos; + return; + } + lFont = font; + mCurFont = font; + } + mLen = idx; +} Float Text::tabAdvance( Float hspace, Uint32 tabWidth, std::optional tabOffset ) { Float advance = hspace * tabWidth; @@ -451,133 +596,79 @@ Sizef Text::draw( const StringType& string, const Vector2f& pos, Font* font, Flo #ifdef EE_TEXT_SHAPER_ENABLED if ( TextShaperEnabled && font->getType() == FontType::TTF ) { FontTrueType* rFont = static_cast( font ); - shapeAndRun( - string, rFont, fontSize, style, outlineThickness, - [&]( hb_glyph_info_t* glyphInfo, hb_glyph_position_t*, Uint32 glyphCount, - const hb_segment_properties_t&, TextShapeRun& run ) { - FontTrueType* font = run.font(); - Uint32 prevGlyphIndex = 0; - Uint32 cluster = 0; - for ( std::size_t i = 0; i < glyphCount; ++i ) { - hb_glyph_info_t curGlyph = glyphInfo[i]; - cluster = curGlyph.cluster; - ch = string[run.curRunStart() + cluster]; - if ( ch == '\t' ) { - Float advance = tabAdvance( hspace, tabWidth, - tabOffset ? cpos.x - pos.x + *tabOffset - : std::optional{} ); - if ( whitespaceDisplayConfig.tabDisplayCharacter ) { - switch ( whitespaceDisplayConfig.tabAlign ) { - case CharacterAlignment::Center: - tabAlign = - ( advance - tabGlyph->getPixelsSize().getWidth() ) * 0.5f; - break; - case CharacterAlignment::Right: - tabAlign = advance - tabGlyph->getPixelsSize().getWidth(); - break; - case CharacterAlignment::Left: - break; - } - } + auto layout = TextLayouter::layout( string, rFont, fontSize, style, tabWidth, + outlineThickness, tabOffset, textDrawHints ); - if ( tabGlyph ) { - drawGlyph( BR, tabGlyph, { cpos.x + tabAlign, cpos.y }, - whitespaceDisplayConfig.color, isItalic ); - } - width += advance; - cpos.x += advance; - } else { - if ( style & Text::Shadow ) { - auto* gds = font->getGlyphDrawableFromGlyphIndex( - curGlyph.codepoint, fontSize, isBold, isItalic, outlineThickness, - rFont->getPage( fontSize ) ); - if ( gds ) - drawGlyph( BR, gds, cpos, shadowColor, isItalic ); - } + for ( const ShapedGlyph& sg : layout.shapedGlyphs ) { + auto ch = string[sg.stringIndex]; + FontTrueType* curFont = static_cast( font ); - if ( outlineThickness != 0.f ) { - auto* gdo = font->getGlyphDrawableFromGlyphIndex( - curGlyph.codepoint, fontSize, isBold, isItalic, outlineThickness, - rFont->getPage( fontSize ) ); - if ( gdo ) - drawGlyph( BR, gdo, cpos, outlineColor, isItalic ); - } + auto gpos( ( sg.position + pos ).trunc() ); - auto* gd = font->getGlyphDrawableFromGlyphIndex( - curGlyph.codepoint, fontSize, isBold, isItalic, 0, - rFont->getPage( fontSize ) ); - if ( gd ) { - if ( !isMonospace ) { - kerning = font->getKerningFromGlyphIndex( - prevGlyphIndex, curGlyph.codepoint, fontSize, isBold, isItalic, - outlineThickness ); - cpos.x += kerning; - width += kerning; - } + if ( ch == '\t' ) { + if ( whitespaceDisplayConfig.tabDisplayCharacter ) { + Float advance = tabAdvance( hspace, tabWidth, + tabOffset ? gpos.x - pos.x + *tabOffset + : std::optional{} ); - drawGlyph( BR, gd, cpos, - fallbacksToColorEmoji && Font::isEmojiCodePoint( ch ) - ? Color::White - : fontColor, - isItalic ); - - if ( ch == ' ' && whitespaceDisplayConfig.spaceDisplayCharacter ) { - if ( spaceGlyph == nullptr ) { - spaceGlyph = font->getGlyphDrawable( - whitespaceDisplayConfig.spaceDisplayCharacter, fontSize ); - } - drawGlyph( BR, spaceGlyph, cpos, whitespaceDisplayConfig.color, - isItalic ); - } - - Float advance = font->isColorEmojiFont() && ' ' != ch - ? gd->getPixelsSize().getWidth() - : gd->getAdvance(); - cpos.x += advance; - width += advance; - } + switch ( whitespaceDisplayConfig.tabAlign ) { + case CharacterAlignment::Center: + tabAlign = ( advance - tabGlyph->getPixelsSize().getWidth() ) * 0.5f; + break; + case CharacterAlignment::Right: + tabAlign = advance - tabGlyph->getPixelsSize().getWidth(); + break; + case CharacterAlignment::Left: + break; } - prevGlyphIndex = curGlyph.codepoint; + if ( tabGlyph ) { + drawGlyph( BR, tabGlyph, { gpos.x + tabAlign, gpos.y }, + whitespaceDisplayConfig.color, isItalic ); + } } + continue; + } - if ( run.runIsNewLine() ) { - if ( style & Text::Underlined ) { - _drawUnderline( font, fontSize, fontColor, cpos, style, BR, - outlineThickness, pos, width, shadowColor, shadowOffset, - outlineColor ); - } - if ( style & Text::StrikeThrough ) { - _drawStrikeThrough( font, fontSize, fontColor, cpos, style, BR, - outlineThickness, pos, width, shadowColor, shadowOffset, - outlineColor ); - } - size.x = eemax( width, size.x ); - width = 0; - cpos.x = pos.x; - cpos.y += height; - if ( cluster != ssize - 1 ) - size.y += height; + if ( ch == ' ' && whitespaceDisplayConfig.spaceDisplayCharacter ) { + if ( spaceGlyph == nullptr ) { + spaceGlyph = font->getGlyphDrawable( + whitespaceDisplayConfig.spaceDisplayCharacter, fontSize ); } - return true; - } ); + drawGlyph( BR, spaceGlyph, gpos, whitespaceDisplayConfig.color, isItalic ); + continue; + } - if ( ( style & Text::Underlined ) && width != 0 ) { - _drawUnderline( font, fontSize, fontColor, cpos, style, BR, outlineThickness, pos, - width, shadowColor, shadowOffset, outlineColor ); + if ( style & Text::Shadow ) { + auto* gds = curFont->getGlyphDrawableFromGlyphIndex( + sg.glyphIndex, fontSize, isBold, isItalic, outlineThickness, + rFont->getPage( fontSize ) ); + if ( gds ) + drawGlyph( BR, gds, gpos, shadowColor, isItalic ); + } + + if ( outlineThickness != 0.f ) { + auto* gdo = curFont->getGlyphDrawableFromGlyphIndex( + sg.glyphIndex, fontSize, isBold, isItalic, outlineThickness, + rFont->getPage( fontSize ) ); + if ( gdo ) + drawGlyph( BR, gdo, gpos, outlineColor, isItalic ); + } + + auto* gd = curFont->getGlyphDrawableFromGlyphIndex( + sg.glyphIndex, fontSize, isBold, isItalic, 0, rFont->getPage( fontSize ) ); + if ( gd ) { + drawGlyph( BR, gd, gpos, + fallbacksToColorEmoji && Font::isEmojiCodePoint( ch ) ? Color::White + : fontColor, + isItalic ); + } } - if ( ( style & Text::StrikeThrough ) && width != 0 ) { - _drawStrikeThrough( font, fontSize, fontColor, cpos, style, BR, outlineThickness, pos, - width, shadowColor, shadowOffset, outlineColor ); - } - - size.x = eemax( width, size.x ); - BR->drawOpt(); - return size; + return layout.size; } #endif @@ -1122,7 +1213,7 @@ Float Text::getTextWidth( Font* font, const Uint32& fontSize, const StringType& Uint32 prevGlyphIndex = 0; for ( std::size_t i = 0; i < glyphCount; ++i ) { hb_glyph_info_t curGlyph = glyphInfo[i]; - auto curChar = string[run.curRunStart() + curGlyph.cluster]; + auto curChar = string[run.pos() + curGlyph.cluster]; if ( curChar == '\t' ) { width += tabAdvance( hspace, tabWidth, tabOffset ? *tabOffset + width : tabOffset ); @@ -1196,7 +1287,7 @@ Text::findLastCharPosWithinLength( Font* font, const Uint32& fontSize, const Str for ( std::size_t i = 0; i < glyphCount; ++i ) { hb_glyph_info_t curGlyph = glyphInfo[i]; - auto curChar = string[run.curRunStart() + curGlyph.cluster]; + auto curChar = string[run.pos() + curGlyph.cluster]; if ( curChar == '\t' ) { width += tabAdvance( hspace, tabWidth, @@ -1406,7 +1497,7 @@ Int32 Text::findCharacterFromPos( const Vector2i& pos, bool returnNearest, Font* for ( std::size_t i = 0; i < glyphCount; ++i ) { hb_glyph_info_t curGlyph = glyphInfo[i]; - auto curChar = string[run.curRunStart() + curGlyph.cluster]; + auto curChar = string[run.pos() + curGlyph.cluster]; lWidth = width; if ( curChar == '\t' ) { @@ -1586,7 +1677,7 @@ void Text::updateWidthCache() { for ( std::size_t i = 0; i < glyphCount; ++i ) { hb_glyph_info_t curGlyph = glyphInfo[i]; - auto curChar = mString[run.curRunStart() + curGlyph.cluster]; + auto curChar = mString[run.pos() + curGlyph.cluster]; if ( curChar == '\t' ) { width += tabAdvance( hspace, mTabWidth, @@ -1952,7 +2043,7 @@ void Text::ensureGeometryUpdate() { for ( std::size_t i = 0; i < glyphCount; ++i ) { hb_glyph_info_t curGlyph = glyphInfo[i]; hb_glyph_position_t curGlyphPos = glyphPos[i]; - auto curChar = mString[run.curRunStart() + curGlyph.cluster]; + auto curChar = mString[run.pos() + curGlyph.cluster]; x += rFont->getKerningFromGlyphIndex( prevGlyphIndex, curGlyph.codepoint, mFontStyleConfig.CharacterSize, bold, From 7f30a7e22b34ad47e3bf3c35fd951dd2085acb37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sun, 26 Oct 2025 21:50:09 -0300 Subject: [PATCH 2/8] Glyph get fixes. --- include/eepp/graphics/fonttruetype.hpp | 1 + include/eepp/graphics/text.hpp | 1 + src/eepp/graphics/text.cpp | 26 ++++++++++++++------------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/include/eepp/graphics/fonttruetype.hpp b/include/eepp/graphics/fonttruetype.hpp index 2a669fc7b..a2bf51383 100644 --- a/include/eepp/graphics/fonttruetype.hpp +++ b/include/eepp/graphics/fonttruetype.hpp @@ -152,6 +152,7 @@ class EE_API FontTrueType : public Font { protected: friend class Text; + friend class TextLayouter; explicit FontTrueType( const std::string& FontName ); diff --git a/include/eepp/graphics/text.hpp b/include/eepp/graphics/text.hpp index 271dbfc89..6c8c1889c 100644 --- a/include/eepp/graphics/text.hpp +++ b/include/eepp/graphics/text.hpp @@ -23,6 +23,7 @@ struct WhitespaceDisplayConfig { }; struct ShapedGlyph { + FontTrueType* font{ nullptr }; Uint32 glyphIndex{ 0 }; size_t stringIndex{ 0 }; Vector2f position; diff --git a/src/eepp/graphics/text.cpp b/src/eepp/graphics/text.cpp index f874267ea..49376bf76 100644 --- a/src/eepp/graphics/text.cpp +++ b/src/eepp/graphics/text.cpp @@ -115,21 +115,22 @@ TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uin #ifdef EE_TEXT_SHAPER_ENABLED if ( Text::TextShaperEnabled && font->getType() == FontType::TTF ) { - FontTrueType* ttfFont = static_cast( font ); + FontTrueType* rFont = static_cast( font ); shapeAndRun( - string, ttfFont, characterSize, style, outlineThickness, + string, rFont, characterSize, style, outlineThickness, [&]( hb_glyph_info_t* glyphInfo, hb_glyph_position_t* glyphPos, Uint32 glyphCount, const hb_segment_properties_t& props, TextShapeRun& run ) { bool isRTL = HB_DIRECTION_IS_HORIZONTAL( props.direction ) && props.direction == HB_DIRECTION_RTL; - FontTrueType* currentFont = run.font(); - if ( !currentFont ) + FontTrueType* font = run.font(); + if ( !font ) return true; result.shapedGlyphs.reserve( glyphCount ); if ( isRTL ) { // For RTL, we trust HarfBuzz positioning completely for ( size_t i = 0; i < glyphCount; ++i ) { ShapedGlyph sg; + sg.font = font; sg.glyphIndex = glyphInfo[i].codepoint; sg.stringIndex = run.pos() + glyphInfo[i].cluster; sg.position.x = pen.x + ( glyphPos[i].x_offset / 64.f ); @@ -152,6 +153,7 @@ TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uin : std::optional{} ); ShapedGlyph sg; + sg.font = font; sg.glyphIndex = glyphInfo[i].codepoint; sg.stringIndex = run.pos() + cluster; sg.position = pen; @@ -161,16 +163,18 @@ TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uin pen.x += advance; continue; } - pen.x += ttfFont->getKerningFromGlyphIndex( + pen.x += font->getKerningFromGlyphIndex( prevGlyphIndex, glyphInfo[i].codepoint, characterSize, bold, italic, outlineThickness ); ShapedGlyph sg; + sg.font = font; sg.glyphIndex = glyphInfo[i].codepoint; sg.stringIndex = run.pos() + cluster; sg.position = pen; result.shapedGlyphs.emplace_back( std::move( sg ) ); - Glyph glyph = ttfFont->getGlyphByIndex( - glyphInfo[i].codepoint, characterSize, bold, italic, outlineThickness ); + Glyph glyph = font->getGlyphByIndex( glyphInfo[i].codepoint, characterSize, + bold, italic, outlineThickness, + rFont->getPage( characterSize ) ); pen.x += glyph.advance; prevGlyphIndex = glyphInfo[i].codepoint; } @@ -602,8 +606,6 @@ Sizef Text::draw( const StringType& string, const Vector2f& pos, Font* font, Flo for ( const ShapedGlyph& sg : layout.shapedGlyphs ) { auto ch = string[sg.stringIndex]; - FontTrueType* curFont = static_cast( font ); - auto gpos( ( sg.position + pos ).trunc() ); if ( ch == '\t' ) { @@ -641,7 +643,7 @@ Sizef Text::draw( const StringType& string, const Vector2f& pos, Font* font, Flo } if ( style & Text::Shadow ) { - auto* gds = curFont->getGlyphDrawableFromGlyphIndex( + auto* gds = sg.font->getGlyphDrawableFromGlyphIndex( sg.glyphIndex, fontSize, isBold, isItalic, outlineThickness, rFont->getPage( fontSize ) ); if ( gds ) @@ -649,14 +651,14 @@ Sizef Text::draw( const StringType& string, const Vector2f& pos, Font* font, Flo } if ( outlineThickness != 0.f ) { - auto* gdo = curFont->getGlyphDrawableFromGlyphIndex( + auto* gdo = sg.font->getGlyphDrawableFromGlyphIndex( sg.glyphIndex, fontSize, isBold, isItalic, outlineThickness, rFont->getPage( fontSize ) ); if ( gdo ) drawGlyph( BR, gdo, gpos, outlineColor, isItalic ); } - auto* gd = curFont->getGlyphDrawableFromGlyphIndex( + auto* gd = sg.font->getGlyphDrawableFromGlyphIndex( sg.glyphIndex, fontSize, isBold, isItalic, 0, rFont->getPage( fontSize ) ); if ( gd ) { drawGlyph( BR, gd, gpos, From 36304f384dc676ac6bc4c94b699181168df5bb18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Wed, 29 Oct 2025 01:40:16 -0300 Subject: [PATCH 3/8] Fixes --- src/eepp/graphics/text.cpp | 44 +++- src/tests/ui_perf_test/ui_perf_test.cpp | 308 +++++++++++++----------- 2 files changed, 197 insertions(+), 155 deletions(-) diff --git a/src/eepp/graphics/text.cpp b/src/eepp/graphics/text.cpp index 2dcf17e40..a53156755 100644 --- a/src/eepp/graphics/text.cpp +++ b/src/eepp/graphics/text.cpp @@ -293,26 +293,46 @@ FontTrueType* TextShapeRun::font() { } void TextShapeRun::findNextEnd() { - Font* lFont = mStartFont; + Font* lFont = mStartFont ? mStartFont : mFont; std::size_t len = mString.size(); - std::size_t idx; std::size_t pos = 0; - for ( idx = mIndex; idx < len; idx++, pos++ ) { - Font* font = mFont - ->getGlyph( mString[idx], mCharacterSize, mStyle & Text::Bold, - mStyle & Text::Italic, mOutlineThickness ) - .font; - mIsNewLine = mString[idx] == '\n'; - if ( mIsNewLine || ( lFont != nullptr && font != lFont ) ) { - mCurFont = lFont; + Uint32 curScript = 0; + + for ( std::size_t idx = mIndex; idx < len; ++idx, ++pos ) { + auto ch = mString[idx]; + hb_script_t script = hb_unicode_script( hb_unicode_funcs_get_default(), ch ); + auto font = mFont + ->getGlyph( ch, mCharacterSize, mStyle & Text::Bold, mStyle & Text::Italic, + mOutlineThickness ) + .font; + mIsNewLine = ( ch == '\n' ); + + if ( idx == mIndex ) { + curScript = script; mStartFont = font; + lFont = font; + mCurFont = font; + } + + // Break run if: + // - Newline + // - Font changed + // - Script changed + hb_script_t effectiveScript = + ( script == HB_SCRIPT_COMMON ) ? (hb_script_t)curScript : script; + if ( mIsNewLine || ( lFont != nullptr && font != lFont ) || + effectiveScript != curScript ) { mLen = mIsNewLine ? pos + 1 : pos; + mCurFont = lFont; return; } + lFont = font; mCurFont = font; + curScript = script; } - mLen = idx; + + mLen = len - mIndex; } Float Text::tabAdvance( Float hspace, Uint32 tabWidth, std::optional tabOffset ) { @@ -1550,7 +1570,7 @@ Int32 Text::findCharacterFromPos( const Vector2i& pos, bool returnNearest, Font* width = 0; lHeight = height; height += vspace; - if ( pos.x > width && pos.y <= lHeight ) { + if ( pos.x > width && pos.y <= lHeight && glyphCount > 0 ) { nearest = run.pos() + glyphInfo[glyphCount - 1].cluster + 1; return false; } diff --git a/src/tests/ui_perf_test/ui_perf_test.cpp b/src/tests/ui_perf_test/ui_perf_test.cpp index 2e18e6027..36d395e52 100644 --- a/src/tests/ui_perf_test/ui_perf_test.cpp +++ b/src/tests/ui_perf_test/ui_perf_test.cpp @@ -152,6 +152,25 @@ void mainLoop() { } EE_MAIN_FUNC int main( int, char*[] ) { + { + Text::TextShaperEnabled = true; + UIApplication app( WindowSettings( 1024, 650, "eepp - TextEdit", WindowStyle::Default, + WindowBackend::Default, 32, {}, 1, false, true ), + UIApplication::Settings( {}, 1.5f ) ); + FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); + auto ll = UILinearLayout::NewVertical(); + ll->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); + auto editor = UICodeEditor::New(); + editor->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); + editor->setParent( ll ); + editor->setLineWrapMode( LineWrapMode::Word ); + editor->setFont( FontManager::instance()->getByName( "monospace" ) ); + editor->loadFromFile( "unit_tests/assets/textfiles/test-arabic.uext" ); + // editor->loadFromFile( "unit_tests/assets/textfiles/test-flags.uext" ); + // editor->loadFromFile( "unit_tests/assets/textformat/english.utf8.lf.nobom.txt" ); + return app.run(); + } + win = Engine::instance()->createWindow( WindowSettings( 1366, 768, "eepp - UI Perf Test" ), ContextSettings( false ) ); @@ -199,50 +218,50 @@ EE_MAIN_FUNC int main( int, char*[] ) { ->setDefaultFont( font ) ->add( theme ); -/* - auto* vlay = UILinearLayout::NewVertical(); - vlay->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); + /* + auto* vlay = UILinearLayout::NewVertical(); + vlay->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); - Clock clock; - auto model = FileSystemModel::New( "." ); // std::make_shared(); - // UITreeView* view = UITreeView::New(); - UITableView* view = UITableView::New(); - // view->setExpanderIconSize( PixelDensity::dpToPx( 20 ) ); - view->setId( "treeview" ); - view->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); - view->setParent( vlay ); - view->setModel( SortingProxyModel::New( model ) ); - Log::notice( "Total time: %.2fms", clock.getElapsedTime().asMilliseconds() ); - */ + Clock clock; + auto model = FileSystemModel::New( "." ); // std::make_shared(); + // UITreeView* view = UITreeView::New(); + UITableView* view = UITableView::New(); + // view->setExpanderIconSize( PixelDensity::dpToPx( 20 ) ); + view->setId( "treeview" ); + view->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); + view->setParent( vlay ); + view->setModel( SortingProxyModel::New( model ) ); + Log::notice( "Total time: %.2fms", clock.getElapsedTime().asMilliseconds() ); + */ /* ListBox test */ -/* - std::vector strings; - for ( size_t i = 0; i < 10000; i++ ) - strings.emplace_back( String::format( - "This is a very long string number %ld. Cover the full width of the listbox.", - i ) ); - auto* lbox = UIListBox::New(); - std::cout << "Time New: " << clock.getElapsedTime().asMilliseconds() << " ms" << std::endl; - lbox->setParent( vlay ); - std::cout << "Time setParent: " << clock.getElapsedTime().asMilliseconds() << " ms" - << std::endl; - lbox->setLayoutMargin( Rectf( 4, 4, 4, 4 ) ); - std::cout << "Time setLayoutMargin: " << clock.getElapsedTime().asMilliseconds() << " ms" - << std::endl; - lbox->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); - std::cout << "Time setLayoutSizePolicy: " << clock.getElapsedTime().asMilliseconds() - << " ms" << std::endl; - for ( size_t i = 0; i < 10; i++ ) - lbox->addListBoxItem( String::format( - "This is a very long string number %ld. Cover the full width of the listbox.", - i ) ); - std::cout << "Time addListBoxItem: " << clock.getElapsedTime().asMilliseconds() << " ms" - << std::endl; - lbox->addListBoxItems( strings ); - std::cout << "Time addListBoxItems: " << clock.getElapsedTime().asMilliseconds() << " ms" - << std::endl; - */ + /* + std::vector strings; + for ( size_t i = 0; i < 10000; i++ ) + strings.emplace_back( String::format( + "This is a very long string number %ld. Cover the full width of the + listbox.", i ) ); auto* lbox = UIListBox::New(); std::cout << "Time New: " << + clock.getElapsedTime().asMilliseconds() << " ms" << std::endl; lbox->setParent( vlay ); + std::cout << "Time setParent: " << clock.getElapsedTime().asMilliseconds() << " ms" + << std::endl; + lbox->setLayoutMargin( Rectf( 4, 4, 4, 4 ) ); + std::cout << "Time setLayoutMargin: " << clock.getElapsedTime().asMilliseconds() << + " ms" + << std::endl; + lbox->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); + std::cout << "Time setLayoutSizePolicy: " << clock.getElapsedTime().asMilliseconds() + << " ms" << std::endl; + for ( size_t i = 0; i < 10; i++ ) + lbox->addListBoxItem( String::format( + "This is a very long string number %ld. Cover the full width of the + listbox.", i ) ); std::cout << "Time addListBoxItem: " << + clock.getElapsedTime().asMilliseconds() << " ms" + << std::endl; + lbox->addListBoxItems( strings ); + std::cout << "Time addListBoxItems: " << clock.getElapsedTime().asMilliseconds() << + " ms" + << std::endl; + */ Clock total; /* Create Widget test */ @@ -277,7 +296,8 @@ EE_MAIN_FUNC int main( int, char*[] ) { but->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ); but->setParent( parent )->clipEnable(); } - std::cout << "Time 10k UIPushButton total: " << total.getElapsedTime().toString() << std::endl; + std::cout << "Time 10k UIPushButton total: " << total.getElapsedTime().toString() + << std::endl; // uiSceneNode->getRoot()->closeAllChildren(); total.restart(); @@ -285,115 +305,117 @@ EE_MAIN_FUNC int main( int, char*[] ) { std::cout << "SceneManager::instance()->update(): " << total.getElapsedTime().toString() << std::endl; -/* - auto* main = UIRelativeLayout::New(); - main->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); - auto* sv = UIScrollView::New(); - sv->setParent( main ); - sv->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); - sv->setPixelsSize( win->getSize().asFloat() ); - auto* vlay = UILinearLayout::NewVertical(); - vlay->setParent( sv ); - vlay->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ); + /* + auto* main = UIRelativeLayout::New(); + main->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); + auto* sv = UIScrollView::New(); + sv->setParent( main ); + sv->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); + sv->setPixelsSize( win->getSize().asFloat() ); + auto* vlay = UILinearLayout::NewVertical(); + vlay->setParent( sv ); + vlay->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ); - total.restart(); - for ( size_t i = 0; i < 100000; i++ ) { - auto* widget = UIWidget::New(); - widget->setParent( vlay ); - widget->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::Fixed ); - widget->setSize( Sizef( 0, 4 ) ); - Colorf col; - col.hsv.h = Math::randf( 0, 360 ); - col.hsv.s = 1; - col.hsv.v = 1; - col.hsv.a = 1; - widget->setBackgroundColor( Color::fromHsv( col ) ); - } - std::cout << "Time UIWidget total: " << total.getElapsedTime().asMilliseconds() << " ms" - << std::endl; - */ -/* - UIWindow* wind = UIWindow::New(); - wind->setSize( 500, 500 ); - wind->setWindowFlags( UI_WIN_DEFAULT_FLAGS | UI_WIN_RESIZEABLE | UI_WIN_MAXIMIZE_BUTTON ); + total.restart(); + for ( size_t i = 0; i < 100000; i++ ) { + auto* widget = UIWidget::New(); + widget->setParent( vlay ); + widget->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::Fixed ); + widget->setSize( Sizef( 0, 4 ) ); + Colorf col; + col.hsv.h = Math::randf( 0, 360 ); + col.hsv.s = 1; + col.hsv.v = 1; + col.hsv.a = 1; + widget->setBackgroundColor( Color::fromHsv( col ) ); + } + std::cout << "Time UIWidget total: " << total.getElapsedTime().asMilliseconds() << " + ms" + << std::endl; + */ + /* + UIWindow* wind = UIWindow::New(); + wind->setSize( 500, 500 ); + wind->setWindowFlags( UI_WIN_DEFAULT_FLAGS | UI_WIN_RESIZEABLE | + UI_WIN_MAXIMIZE_BUTTON ); - UILinearLayout* layWin = UILinearLayout::NewVertical(); - layWin->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); - layWin->setParent( wind ); + UILinearLayout* layWin = UILinearLayout::NewVertical(); + layWin->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); + layWin->setParent( wind ); - UILinearLayout* layPar = UILinearLayout::NewHorizontal(); - layPar->setParent( layWin ); - layPar->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ); - layPar->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ); - layPar->setLayoutGravity( UI_VALIGN_CENTER | UI_HALIGN_CENTER ); - layPar->setBackgroundColor( 0x999999FF ); + UILinearLayout* layPar = UILinearLayout::NewHorizontal(); + layPar->setParent( layWin ); + layPar->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ); + layPar->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ); + layPar->setLayoutGravity( UI_VALIGN_CENTER | UI_HALIGN_CENTER ); + layPar->setBackgroundColor( 0x999999FF ); - UILinearLayout* lay = UILinearLayout::NewVertical(); - lay->setLayoutGravity( UI_HALIGN_CENTER | UI_VALIGN_CENTER ); - lay->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ); - lay->setBackgroundColor( 0x333333FF ); - lay->setLayoutWeight( 0.7f ); + UILinearLayout* lay = UILinearLayout::NewVertical(); + lay->setLayoutGravity( UI_HALIGN_CENTER | UI_VALIGN_CENTER ); + lay->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ); + lay->setBackgroundColor( 0x333333FF ); + lay->setLayoutWeight( 0.7f ); - UITextView::New() - ->setText( "Text on test 1" ) - ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) - ->setLayoutSizePolicy( SizePolicy::WrapContent, SizePolicy::WrapContent ) - ->setParent( lay ); - UITextView::New() - ->setText( "Text on test 2" ) - ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) - ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) - ->setParent( lay ); - UICheckBox::New() - ->setText( "Checkbox" ) - ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) - ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) - ->setParent( lay ); - UITextView::New() - ->setText( "Text on test 3" ) - ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) - ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) - ->setParent( lay ); - UITextView::New() - ->setText( "Text on test 4" ) - ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) - ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) - ->setParent( lay ); - UITextInput::New() - ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) - ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) - ->setParent( lay ); + UITextView::New() + ->setText( "Text on test 1" ) + ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) + ->setLayoutSizePolicy( SizePolicy::WrapContent, SizePolicy::WrapContent ) + ->setParent( lay ); + UITextView::New() + ->setText( "Text on test 2" ) + ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) + ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) + ->setParent( lay ); + UICheckBox::New() + ->setText( "Checkbox" ) + ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) + ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) + ->setParent( lay ); + UITextView::New() + ->setText( "Text on test 3" ) + ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) + ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) + ->setParent( lay ); + UITextView::New() + ->setText( "Text on test 4" ) + ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) + ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) + ->setParent( lay ); + UITextInput::New() + ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) + ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) + ->setParent( lay ); - UILinearLayout* lay2 = UILinearLayout::NewVertical(); - lay2->setId( "hardlay" ); - lay2->setLayoutGravity( UI_HALIGN_CENTER | UI_VALIGN_CENTER ); - lay2->setLayoutSizePolicy( SizePolicy::Fixed, SizePolicy::WrapContent ); - lay2->setBackgroundColor( Color::Black ); - lay2->setLayoutWeight( 0.3f ); + UILinearLayout* lay2 = UILinearLayout::NewVertical(); + lay2->setId( "hardlay" ); + lay2->setLayoutGravity( UI_HALIGN_CENTER | UI_VALIGN_CENTER ); + lay2->setLayoutSizePolicy( SizePolicy::Fixed, SizePolicy::WrapContent ); + lay2->setBackgroundColor( Color::Black ); + lay2->setLayoutWeight( 0.3f ); - UIPushButton::New() - ->setText( "PushButton" ) - ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) - ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) - ->setLayoutGravity( UI_VALIGN_CENTER ) - ->setParent( lay2 ); - UIListBox* lbox = UIListBox::New(); - lbox->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) - ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::Fixed ) - ->setSize( 0, 105 ) - ->setParent( lay2 ); - lbox->addListBoxItems( { "This", "is", "a", "ListBox" } ); - lay2->setParent( layPar ); - lay->setParent( layPar ); + UIPushButton::New() + ->setText( "PushButton" ) + ->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) + ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) + ->setLayoutGravity( UI_VALIGN_CENTER ) + ->setParent( lay2 ); + UIListBox* lbox = UIListBox::New(); + lbox->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) + ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::Fixed ) + ->setSize( 0, 105 ) + ->setParent( lay2 ); + lbox->addListBoxItems( { "This", "is", "a", "ListBox" } ); + lay2->setParent( layPar ); + lay->setParent( layPar ); - UIDropDownList* drop = UIDropDownList::New(); - drop->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) - ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) - ->setParent( layWin ); - drop->getListBox()->addListBoxItems( { "Car", "Bus", "Plane", "Submarine" } ); - drop->getListBox()->setSelected( 0 ); - wind->show(); - */ + UIDropDownList* drop = UIDropDownList::New(); + drop->setLayoutMargin( Rectf( 10, 10, 10, 10 ) ) + ->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::WrapContent ) + ->setParent( layWin ); + drop->getListBox()->addListBoxItems( { "Car", "Bus", "Plane", "Submarine" } ); + drop->getListBox()->setSelected( 0 ); + wind->show(); + */ win->runMainLoop( &mainLoop ); } From b9f34095f21d44ce19fcb820e1d253c378ae7b99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Wed, 29 Oct 2025 19:46:26 -0300 Subject: [PATCH 4/8] Fix font rendering tests with text shaping. --- src/eepp/graphics/text.cpp | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/eepp/graphics/text.cpp b/src/eepp/graphics/text.cpp index a53156755..0dc50b8a0 100644 --- a/src/eepp/graphics/text.cpp +++ b/src/eepp/graphics/text.cpp @@ -293,10 +293,11 @@ FontTrueType* TextShapeRun::font() { } void TextShapeRun::findNextEnd() { +#ifdef EE_TEXT_SHAPER_ENABLED Font* lFont = mStartFont ? mStartFont : mFont; std::size_t len = mString.size(); std::size_t pos = 0; - Uint32 curScript = 0; + hb_script_t curScript = HB_SCRIPT_UNKNOWN; for ( std::size_t idx = mIndex; idx < len; ++idx, ++pos ) { auto ch = mString[idx]; @@ -312,6 +313,8 @@ void TextShapeRun::findNextEnd() { mStartFont = font; lFont = font; mCurFont = font; + if ( curScript == HB_SCRIPT_COMMON ) + curScript = HB_SCRIPT_LATIN; } // Break run if: @@ -320,6 +323,7 @@ void TextShapeRun::findNextEnd() { // - Script changed hb_script_t effectiveScript = ( script == HB_SCRIPT_COMMON ) ? (hb_script_t)curScript : script; + if ( mIsNewLine || ( lFont != nullptr && font != lFont ) || effectiveScript != curScript ) { mLen = mIsNewLine ? pos + 1 : pos; @@ -329,10 +333,32 @@ void TextShapeRun::findNextEnd() { lFont = font; mCurFont = font; - curScript = script; + curScript = effectiveScript; } mLen = len - mIndex; +#else + Font* lFont = mStartFont; + std::size_t len = mString.size(); + std::size_t idx; + std::size_t pos = 0; + for ( idx = mIndex; idx < len; idx++, pos++ ) { + Font* font = mFont + ->getGlyph( mString[idx], mCharacterSize, mStyle & Text::Bold, + mStyle & Text::Italic, mOutlineThickness ) + .font; + mIsNewLine = mString[idx] == '\n'; + if ( mIsNewLine || ( lFont != nullptr && font != lFont ) ) { + mCurFont = lFont; + mStartFont = font; + mLen = mIsNewLine ? pos + 1 : pos; + return; + } + lFont = font; + mCurFont = font; + } + mLen = idx; +#endif } Float Text::tabAdvance( Float hspace, Uint32 tabWidth, std::optional tabOffset ) { From 88d419e242b1cd1b67354cba8833d582cd45ec52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sat, 1 Nov 2025 20:03:23 -0300 Subject: [PATCH 5/8] Testing a few things. --- .../assets/fonts/NotoNaskhArabic-Regular.ttf | Bin 0 -> 199076 bytes .../textfiles/test-arabic-long-phrase.uext | 1 + .../assets/textfiles/test-arabic-simple.uext | 1 + .../assets/textfiles/test-arabic.uext | 25 +++++++++++++++++- src/eepp/graphics/fonttruetype.cpp | 6 +++++ src/eepp/graphics/text.cpp | 21 ++++++++------- src/tests/ui_perf_test/ui_perf_test.cpp | 16 +++++++---- 7 files changed, 54 insertions(+), 16 deletions(-) create mode 100644 bin/unit_tests/assets/fonts/NotoNaskhArabic-Regular.ttf create mode 100644 bin/unit_tests/assets/textfiles/test-arabic-long-phrase.uext create mode 100644 bin/unit_tests/assets/textfiles/test-arabic-simple.uext diff --git a/bin/unit_tests/assets/fonts/NotoNaskhArabic-Regular.ttf b/bin/unit_tests/assets/fonts/NotoNaskhArabic-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ec013bea2ae6b9321afdd94d3c48dca995f62124 GIT binary patch literal 199076 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 R#I99cuMzePo3U`={{uzFd>sG) literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/textfiles/test-arabic-long-phrase.uext b/bin/unit_tests/assets/textfiles/test-arabic-long-phrase.uext new file mode 100644 index 000000000..646cae5e6 --- /dev/null +++ b/bin/unit_tests/assets/textfiles/test-arabic-long-phrase.uext @@ -0,0 +1 @@ +اسکم شاخ و دم نداره همین که کاربر شبکه خودت. کسی که رو شبکه تو فی داده سالها زحمت کشیده رو نادیده میگیری و به کاربر یه شبکه دیگه توکن سنگین میدی میشه اسکم علنی. باید کاری باهاش کنیم که مثل استارک به غلط کردن بیافته اره تو endgame هستی اخر اسکمرایی diff --git a/bin/unit_tests/assets/textfiles/test-arabic-simple.uext b/bin/unit_tests/assets/textfiles/test-arabic-simple.uext new file mode 100644 index 000000000..0518d8fce --- /dev/null +++ b/bin/unit_tests/assets/textfiles/test-arabic-simple.uext @@ -0,0 +1 @@ +مَرْحَبًا بِالْعَالَم diff --git a/bin/unit_tests/assets/textfiles/test-arabic.uext b/bin/unit_tests/assets/textfiles/test-arabic.uext index 646cae5e6..ba4616f46 100644 --- a/bin/unit_tests/assets/textfiles/test-arabic.uext +++ b/bin/unit_tests/assets/textfiles/test-arabic.uext @@ -1 +1,24 @@ -اسکم شاخ و دم نداره همین که کاربر شبکه خودت. کسی که رو شبکه تو فی داده سالها زحمت کشیده رو نادیده میگیری و به کاربر یه شبکه دیگه توکن سنگین میدی میشه اسکم علنی. باید کاری باهاش کنیم که مثل استارک به غلط کردن بیافته اره تو endgame هستی اخر اسکمرایی +Hello: مرحبا +Good morning: صباح الخير +Good night: تصبح على خير +Thank you: شكراً +You're welcome: عفواً +Yes / No: نعم / لا +Please: من فضلك +Excuse me / Sorry: عفواً / آسف +How are you?: كيف حالك؟ +I'm fine. And you?: أنا بخير. وأنت؟ +What's your name?: ما اسمك؟ +My name is...: اسمي... +Nice to meet you: تشرفت بلقائك +Where are you from?: من أين أنت؟ +I'm from...: أنا من... +Do you speak English?: هل تتحدث الإنجليزية؟ +I don't understand: لا أفهم +Please speak more slowly: من فضلك تكلم ببطء أكثر +Please write it down: من فضلك اكتبه +How much is this?: كم سعره؟ +Where is the bathroom?: أين الحمام؟ +Help!: المساعدة! +Stop!: توقف! +Call the police!: اتصل بالشرطة! diff --git a/src/eepp/graphics/fonttruetype.cpp b/src/eepp/graphics/fonttruetype.cpp index d07745ae1..ee5dda144 100644 --- a/src/eepp/graphics/fonttruetype.cpp +++ b/src/eepp/graphics/fonttruetype.cpp @@ -1290,11 +1290,17 @@ bool FontTrueType::setCurrentSize( unsigned int characterSize ) const { } } else if ( characterSize != currentSize && ( result = FT_Set_Pixel_Sizes( face, 0, it->second ) ) == FT_Err_Ok ) { +#ifdef EE_TEXT_SHAPER_ENABLED + hb_ft_font_changed( (hb_font_t*)mHBFont ); +#endif return true; } } } +#ifdef EE_TEXT_SHAPER_ENABLED + hb_ft_font_changed( (hb_font_t*)mHBFont ); +#endif return result == FT_Err_Ok; } else { return true; diff --git a/src/eepp/graphics/text.cpp b/src/eepp/graphics/text.cpp index 0dc50b8a0..7c9f1545a 100644 --- a/src/eepp/graphics/text.cpp +++ b/src/eepp/graphics/text.cpp @@ -25,8 +25,8 @@ shapeAndRun( const String& string, FontTrueType* font, Uint32 characterSize, Uin Float outlineThickness, const std::function& cb ) { - hb_buffer_t* hbBuffer = hb_buffer_create(); TextShapeRun run( string.view(), font, characterSize, style, outlineThickness ); + hb_buffer_t* hbBuffer = hb_buffer_create(); bool completeRun = true; while ( run.hasNext() ) { @@ -57,7 +57,7 @@ shapeAndRun( const String& string, FontTrueType* font, Uint32 characterSize, Uin }; // whitelist cross-platforms shapers only - static const char* shaper_list[] = { "graphite2", "ot", "fallback", nullptr }; + static const char* shaper_list[] = { "ot", "graphite2", "fallback", nullptr }; if ( !font || !font->hb() ) { eeASSERT( font && font->hb() ); @@ -129,15 +129,16 @@ TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uin if ( isRTL ) { // For RTL, we trust HarfBuzz positioning completely for ( size_t i = 0; i < glyphCount; ++i ) { + auto& curGpos = glyphPos[i]; ShapedGlyph sg; sg.font = font; sg.glyphIndex = glyphInfo[i].codepoint; sg.stringIndex = run.pos() + glyphInfo[i].cluster; - sg.position.x = pen.x + ( glyphPos[i].x_offset / 64.f ); - sg.position.y = pen.y - ( glyphPos[i].y_offset / 64.f ); + sg.position.x = pen.x + ( curGpos.x_offset / 64.f ); + sg.position.y = pen.y - ( curGpos.y_offset / 64.f ); result.shapedGlyphs.emplace_back( std::move( sg ) ); - pen.x += glyphPos[i].x_advance / 64.f; - pen.y += glyphPos[i].y_advance / 64.f; + pen.x += curGpos.x_advance / 64.f; + pen.y += curGpos.y_advance / 64.f; } } else { // For LTR, we use our custom kerning Uint32 prevGlyphIndex = 0; @@ -313,7 +314,7 @@ void TextShapeRun::findNextEnd() { mStartFont = font; lFont = font; mCurFont = font; - if ( curScript == HB_SCRIPT_COMMON ) + if ( curScript == HB_SCRIPT_COMMON || curScript == HB_SCRIPT_INHERITED ) curScript = HB_SCRIPT_LATIN; } @@ -322,10 +323,10 @@ void TextShapeRun::findNextEnd() { // - Font changed // - Script changed hb_script_t effectiveScript = - ( script == HB_SCRIPT_COMMON ) ? (hb_script_t)curScript : script; + ( script == HB_SCRIPT_COMMON || script == HB_SCRIPT_INHERITED ) ? (hb_script_t)curScript + : script; - if ( mIsNewLine || ( lFont != nullptr && font != lFont ) || - effectiveScript != curScript ) { + if ( mIsNewLine || ( lFont != nullptr && font != lFont ) || effectiveScript != curScript ) { mLen = mIsNewLine ? pos + 1 : pos; mCurFont = lFont; return; diff --git a/src/tests/ui_perf_test/ui_perf_test.cpp b/src/tests/ui_perf_test/ui_perf_test.cpp index 36d395e52..1d57fde09 100644 --- a/src/tests/ui_perf_test/ui_perf_test.cpp +++ b/src/tests/ui_perf_test/ui_perf_test.cpp @@ -160,14 +160,20 @@ EE_MAIN_FUNC int main( int, char*[] ) { FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); auto ll = UILinearLayout::NewVertical(); ll->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); - auto editor = UICodeEditor::New(); + auto editor = UITextEdit::New(); editor->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); editor->setParent( ll ); - editor->setLineWrapMode( LineWrapMode::Word ); - editor->setFont( FontManager::instance()->getByName( "monospace" ) ); - editor->loadFromFile( "unit_tests/assets/textfiles/test-arabic.uext" ); + FontManager::instance()->addFallbackFont( + FontTrueType::New( "arabic", "unit_tests/assets/fonts/NotoNaskhArabic-Regular.ttf" ) ); + // editor->setLineWrapMode( LineWrapMode::Word ); + // editor->setFont( FontManager::instance()->getByName( "monospace" ) ); + // editor->loadFromFile( "unit_tests/assets/textfiles/test-arabic-simple.uext" ); + // editor->loadFromFile( "unit_tests/assets/textfiles/test-arabic.uext" ); + // editor->loadFromFile( "unit_tests/assets/textfiles/test-bengali.uext" ); // editor->loadFromFile( "unit_tests/assets/textfiles/test-flags.uext" ); - // editor->loadFromFile( "unit_tests/assets/textformat/english.utf8.lf.nobom.txt" ); + // editor->setFontSize( PixelDensity::dpToPx( 32 ) ); + editor->loadFromFile( "unit_tests/assets/textformat/english.utf8.lf.nobom.txt" ); + // editor->getDocument().textInput( "اسمي..." ); return app.run(); } From d4620b1f4b5a75c631bd56d6db8ef5e49d3c0150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sat, 1 Nov 2025 23:34:27 -0300 Subject: [PATCH 6/8] Some text shaping improvements. --- .../fontrendering/eepp-textedit-bengali.webp | Bin 16584 -> 16776 bytes .../assets/fonts/NotoSansBengali-Regular.ttf | Bin 0 -> 168208 bytes .../assets/fonts/NotoSerifBengali-Regular.ttf | Bin 263812 -> 0 bytes src/eepp/graphics/text.cpp | 155 +++++++++--------- src/tests/ui_perf_test/ui_perf_test.cpp | 25 ++- src/tests/unit_tests/fontrendering.cpp | 4 +- 6 files changed, 99 insertions(+), 85 deletions(-) create mode 100644 bin/unit_tests/assets/fonts/NotoSansBengali-Regular.ttf delete mode 100644 bin/unit_tests/assets/fonts/NotoSerifBengali-Regular.ttf diff --git a/bin/unit_tests/assets/fontrendering/eepp-textedit-bengali.webp b/bin/unit_tests/assets/fontrendering/eepp-textedit-bengali.webp index 76559799440c14e5d255c34474491492b2e1650d..36cdff38a3dc5ca8f8efe55581cc338e7bb9e9b7 100644 GIT binary patch literal 16776 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 QE$^LvH7wVDFJyrK1H%A|EdT%j literal 16584 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

Ll~wW3Tza1N&bVStT`j_J)pJk# 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 diff --git a/bin/unit_tests/assets/fonts/NotoSansBengali-Regular.ttf b/bin/unit_tests/assets/fonts/NotoSansBengali-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..03436c3abcb006eefa31ec238e6285b7395f68b8 GIT binary patch literal 168208 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 E0r?iX$p8QV literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/fonts/NotoSerifBengali-Regular.ttf b/bin/unit_tests/assets/fonts/NotoSerifBengali-Regular.ttf deleted file mode 100644 index a9351b8d6a635747cb18cc6feaf3ae976961b6c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263812 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�c13AAo$ZWZ+M-{ki1pFcZ~f5N*ZnO$ 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 W7ZbYzwy$7h?mZB-5?@#7rT+)6)X4Y% diff --git a/src/eepp/graphics/text.cpp b/src/eepp/graphics/text.cpp index 7c9f1545a..bcc28d8ce 100644 --- a/src/eepp/graphics/text.cpp +++ b/src/eepp/graphics/text.cpp @@ -94,6 +94,13 @@ shapeAndRun( const String& string, const FontStyleConfig& config, } #endif +// New helper function to identify scripts where our custom kerning is safe to apply. +static inline bool isSimpleScript( hb_script_t script ) { + // This list can be expanded, but covers the most common simple LTR scripts. + return script == HB_SCRIPT_LATIN || script == HB_SCRIPT_GREEK || script == HB_SCRIPT_CYRILLIC || + script == HB_SCRIPT_INVALID; +} + template TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uint32& characterSize, const Uint32& style, const Uint32& tabWidth, @@ -120,65 +127,87 @@ TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uin string, rFont, characterSize, style, outlineThickness, [&]( hb_glyph_info_t* glyphInfo, hb_glyph_position_t* glyphPos, Uint32 glyphCount, const hb_segment_properties_t& props, TextShapeRun& run ) { - bool isRTL = HB_DIRECTION_IS_HORIZONTAL( props.direction ) && - props.direction == HB_DIRECTION_RTL; - FontTrueType* font = run.font(); - if ( !font ) + FontTrueType* currentRunFont = run.font(); + if ( !currentRunFont ) return true; - result.shapedGlyphs.reserve( glyphCount ); + result.shapedGlyphs.reserve( result.shapedGlyphs.size() + glyphCount ); + Uint32 prevGlyphIndex = 0; - if ( isRTL ) { // For RTL, we trust HarfBuzz positioning completely + if ( isSimpleScript( props.script ) ) { for ( size_t i = 0; i < glyphCount; ++i ) { - auto& curGpos = glyphPos[i]; - ShapedGlyph sg; - sg.font = font; - sg.glyphIndex = glyphInfo[i].codepoint; - sg.stringIndex = run.pos() + glyphInfo[i].cluster; - sg.position.x = pen.x + ( curGpos.x_offset / 64.f ); - sg.position.y = pen.y - ( curGpos.y_offset / 64.f ); - result.shapedGlyphs.emplace_back( std::move( sg ) ); - pen.x += curGpos.x_advance / 64.f; - pen.y += curGpos.y_advance / 64.f; - } - } else { // For LTR, we use our custom kerning - Uint32 prevGlyphIndex = 0; - Uint32 cluster = 0; - String::StringBaseType ch; + Uint32 cluster = glyphInfo[i].cluster; + String::StringBaseType ch = string[run.pos() + cluster]; - for ( size_t i = 0; i < glyphCount; ++i ) { - cluster = glyphInfo[i].cluster; - ch = string[run.pos() + cluster]; if ( ch == '\t' ) { Float advance = Text::tabAdvance( hspace, tabWidth, tabOffset ? pen.x + *tabOffset : std::optional{} ); - ShapedGlyph sg; - sg.font = font; + sg.font = currentRunFont; sg.glyphIndex = glyphInfo[i].codepoint; sg.stringIndex = run.pos() + cluster; sg.position = pen; result.shapedGlyphs.emplace_back( std::move( sg ) ); - prevGlyphIndex = glyphInfo[i].codepoint; pen.x += advance; + prevGlyphIndex = 0; // Reset kerning after a tab continue; } - pen.x += font->getKerningFromGlyphIndex( + + Glyph currentGlyph = currentRunFont->getGlyphByIndex( + glyphInfo[i].codepoint, characterSize, bold, italic, outlineThickness ); + + pen.x += currentRunFont->getKerningFromGlyphIndex( prevGlyphIndex, glyphInfo[i].codepoint, characterSize, bold, italic, outlineThickness ); + ShapedGlyph sg; - sg.font = font; + sg.font = currentRunFont; sg.glyphIndex = glyphInfo[i].codepoint; - sg.stringIndex = run.pos() + cluster; - sg.position = pen; + sg.stringIndex = run.pos() + glyphInfo[i].cluster; + + float offsetX = glyphPos[i].x_offset / 64.f; + float offsetY = glyphPos[i].y_offset / 64.f; + sg.position.x = pen.x + offsetX; + sg.position.y = pen.y - offsetY; result.shapedGlyphs.emplace_back( std::move( sg ) ); - Glyph glyph = font->getGlyphByIndex( glyphInfo[i].codepoint, characterSize, - bold, italic, outlineThickness, - rFont->getPage( characterSize ) ); - pen.x += glyph.advance; + + pen.x += currentGlyph.advance; prevGlyphIndex = glyphInfo[i].codepoint; } + } else { + for ( size_t i = 0; i < glyphCount; ++i ) { + Uint32 cluster = glyphInfo[i].cluster; + String::StringBaseType ch = string[run.pos() + cluster]; + + if ( ch == '\t' ) { + Float advance = Text::tabAdvance( hspace, tabWidth, + tabOffset ? pen.x + *tabOffset + : std::optional{} ); + ShapedGlyph sg; + sg.font = currentRunFont; + sg.glyphIndex = glyphInfo[i].codepoint; + sg.stringIndex = run.pos() + cluster; + sg.position = pen; + result.shapedGlyphs.emplace_back( std::move( sg ) ); + + pen.x += advance; + prevGlyphIndex = 0; // Reset kerning after a tab + continue; + } + + ShapedGlyph sg; + sg.font = currentRunFont; + sg.glyphIndex = glyphInfo[i].codepoint; + sg.stringIndex = run.pos() + glyphInfo[i].cluster; + float offsetX = glyphPos[i].x_offset / 64.f; + float offsetY = glyphPos[i].y_offset / 64.f; + sg.position.x = pen.x + offsetX; + sg.position.y = pen.y - offsetY; + result.shapedGlyphs.emplace_back( std::move( sg ) ); + pen.x += glyphPos[i].x_advance / 64.f; + pen.y += glyphPos[i].y_advance / 64.f; + } } if ( run.runIsNewLine() ) { @@ -236,7 +265,7 @@ TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uin result.linesWidth.push_back( pen.x ); maxWidth = eemax( maxWidth, pen.x ); - result.size = { maxWidth, pen.y + vspace }; + result.size = { maxWidth, pen.y }; return result; } @@ -645,7 +674,8 @@ Sizef Text::draw( const StringType& string, const Vector2f& pos, Font* font, Flo BR->setTexture( fontTexture, fontTexture->getCoordinateType() ); #ifdef EE_TEXT_SHAPER_ENABLED - if ( TextShaperEnabled && font->getType() == FontType::TTF ) { + if ( TextShaperEnabled /* && !( textDrawHints & TextHints::AllAscii ) */ && + font->getType() == FontType::TTF ) { FontTrueType* rFont = static_cast( font ); auto layout = TextLayouter::layout( string, rFont, fontSize, style, tabWidth, @@ -680,12 +710,14 @@ Sizef Text::draw( const StringType& string, const Vector2f& pos, Font* font, Flo continue; } - if ( ch == ' ' && whitespaceDisplayConfig.spaceDisplayCharacter ) { - if ( spaceGlyph == nullptr ) { - spaceGlyph = font->getGlyphDrawable( - whitespaceDisplayConfig.spaceDisplayCharacter, fontSize ); + if ( ch == ' ' ) { + if ( whitespaceDisplayConfig.spaceDisplayCharacter ) { + if ( spaceGlyph == nullptr ) { + spaceGlyph = font->getGlyphDrawable( + whitespaceDisplayConfig.spaceDisplayCharacter, fontSize ); + } + drawGlyph( BR, spaceGlyph, gpos, whitespaceDisplayConfig.color, isItalic ); } - drawGlyph( BR, spaceGlyph, gpos, whitespaceDisplayConfig.color, isItalic ); continue; } @@ -1252,40 +1284,11 @@ Float Text::getTextWidth( Font* font, const Uint32& fontSize, const StringType& } #ifdef EE_TEXT_SHAPER_ENABLED - if ( TextShaperEnabled && font->getType() == FontType::TTF ) { - FontTrueType* rFont = static_cast( font ); - shapeAndRun( - string, rFont, fontSize, style, outlineThickness, - [&]( hb_glyph_info_t* glyphInfo, hb_glyph_position_t*, Uint32 glyphCount, - const hb_segment_properties_t&, TextShapeRun& run ) { - FontTrueType* font = run.font(); - Uint32 prevGlyphIndex = 0; - for ( std::size_t i = 0; i < glyphCount; ++i ) { - hb_glyph_info_t curGlyph = glyphInfo[i]; - auto curChar = string[run.pos() + curGlyph.cluster]; - if ( curChar == '\t' ) { - width += tabAdvance( hspace, tabWidth, - tabOffset ? *tabOffset + width : tabOffset ); - } else { - Glyph glyph = - font->getGlyphByIndex( curGlyph.codepoint, fontSize, bold, italic, - outlineThickness, rFont->getPage( fontSize ) ); - - width += rFont->getKerningFromGlyphIndex( prevGlyphIndex, - curGlyph.codepoint, fontSize, - bold, italic, outlineThickness ); - - width += font->isColorEmojiFont() && ' ' != curChar ? glyph.size.getWidth() - : glyph.advance; - } - maxWidth = eemax( maxWidth, width ); - prevGlyphIndex = curGlyph.codepoint; - } - if ( run.runIsNewLine() ) - width = 0; - return true; - } ); - return maxWidth; + if ( TextShaperEnabled /* && !( textDrawHints & TextHints::AllAscii ) */ && + font->getType() == FontType::TTF ) { + return TextLayouter::layout( string, static_cast( font ), fontSize, style, + tabWidth, outlineThickness, tabOffset, textDrawHints ) + .size.getWidth(); } #endif diff --git a/src/tests/ui_perf_test/ui_perf_test.cpp b/src/tests/ui_perf_test/ui_perf_test.cpp index 1d57fde09..2ec944681 100644 --- a/src/tests/ui_perf_test/ui_perf_test.cpp +++ b/src/tests/ui_perf_test/ui_perf_test.cpp @@ -153,27 +153,38 @@ void mainLoop() { EE_MAIN_FUNC int main( int, char*[] ) { { - Text::TextShaperEnabled = true; + Text::TextShaperEnabled = false; UIApplication app( WindowSettings( 1024, 650, "eepp - TextEdit", WindowStyle::Default, WindowBackend::Default, 32, {}, 1, false, true ), UIApplication::Settings( {}, 1.5f ) ); FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); auto ll = UILinearLayout::NewVertical(); ll->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); - auto editor = UITextEdit::New(); + auto editor = UICodeEditor::New(); + editor->setShowLineNumber( false ); editor->setLayoutSizePolicy( SizePolicy::MatchParent, SizePolicy::MatchParent ); editor->setParent( ll ); - FontManager::instance()->addFallbackFont( - FontTrueType::New( "arabic", "unit_tests/assets/fonts/NotoNaskhArabic-Regular.ttf" ) ); + // editor->setFontSize( PixelDensity::dpToPx( 32 ) ); + /* FontManager::instance()->addFallbackFont( + FontTrueType::New( "arabic", "unit_tests/assets/fonts/NotoNaskhArabic-Regular.ttf" ) ); */ + FontManager::instance()->addFallbackFont( FontTrueType::New( + "NotoSerifBengali-Regular", "unit_tests/assets/fonts/NotoSansBengali-Regular.ttf" ) ); // editor->setLineWrapMode( LineWrapMode::Word ); // editor->setFont( FontManager::instance()->getByName( "monospace" ) ); // editor->loadFromFile( "unit_tests/assets/textfiles/test-arabic-simple.uext" ); - // editor->loadFromFile( "unit_tests/assets/textfiles/test-arabic.uext" ); + editor->loadFromFile( "unit_tests/assets/textfiles/test-arabic.uext" ); // editor->loadFromFile( "unit_tests/assets/textfiles/test-bengali.uext" ); // editor->loadFromFile( "unit_tests/assets/textfiles/test-flags.uext" ); - // editor->setFontSize( PixelDensity::dpToPx( 32 ) ); - editor->loadFromFile( "unit_tests/assets/textformat/english.utf8.lf.nobom.txt" ); + // editor->loadFromFile( "unit_tests/assets/textformat/english.utf8.lf.nobom.txt" ); // editor->getDocument().textInput( "اسمي..." ); + // editor->getDocument().textInput( " হ্যাঁ " ); + editor->setFont( app.getUI()->getUIThemeManager()->getDefaultFont() ); + editor->on( Event::KeyUp, [&]( const Event* event ) { + if ( event->asKeyEvent()->getKeyCode() == KEY_F1 ){ + Text::TextShaperEnabled = !Text::TextShaperEnabled; + app.getUI()->getRoot()->invalidateDraw(); + } + } ); return app.run(); } diff --git a/src/tests/unit_tests/fontrendering.cpp b/src/tests/unit_tests/fontrendering.cpp index 7ba0399d0..a91528392 100644 --- a/src/tests/unit_tests/fontrendering.cpp +++ b/src/tests/unit_tests/fontrendering.cpp @@ -376,8 +376,8 @@ UTEST( FontRendering, textEditBengaliTest ) { WindowBackend::Default, 32, {}, 1, false, true ), UIApplication::Settings( Sys::getProcessPath() + ".." + FileSystem::getOSSlash(), 1.5f ) ); FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); - FontTrueType* bengaliFont = FontTrueType::New( "NotoSerifBengali-Regular", - "assets/fonts/NotoSerifBengali-Regular.ttf" ); + FontTrueType* bengaliFont = FontTrueType::New( "NotoSansBengali-Regular", + "assets/fonts/NotoSansBengali-Regular.ttf" ); FontManager::instance()->addFallbackFont( bengaliFont ); UTEST_PRINT_STEP( "Text Shaper enabled" ); auto* editor = UITextEdit::New(); From 58b8a815d29e0ba7ac57c6de5b7923ca35b9bd86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sun, 2 Nov 2025 13:47:15 -0300 Subject: [PATCH 7/8] Many text-shaper fixes and many more tests. --- .../fontrendering/eepp-text-style-bold.webp | Bin 0 -> 7990 bytes .../fontrendering/eepp-text-style-italic.webp | Bin 0 -> 9404 bytes .../eepp-text-style-outline.webp | Bin 0 -> 10242 bytes .../eepp-text-style-regular-center.webp | Bin 0 -> 7792 bytes .../eepp-text-style-regular-right.webp | Bin 0 -> 7818 bytes .../eepp-text-style-regular.webp | Bin 0 -> 7870 bytes .../fontrendering/eepp-text-style-shadow.webp | Bin 0 -> 8994 bytes .../eepp-text-style-strikethrough-center.webp | Bin 0 -> 7358 bytes .../eepp-text-style-strikethrough-right.webp | Bin 0 -> 7446 bytes .../eepp-text-style-strikethrough.webp | Bin 0 -> 7438 bytes .../eepp-text-style-underline-center.webp | Bin 0 -> 7834 bytes .../eepp-text-style-underline-right.webp | Bin 0 -> 7836 bytes .../eepp-text-style-underline.webp | Bin 0 -> 7888 bytes include/eepp/graphics/text.hpp | 9 +- src/eepp/graphics/text.cpp | 669 ++++++++---------- src/tests/unit_tests/fontrendering.cpp | 140 +++- 16 files changed, 438 insertions(+), 380 deletions(-) create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-bold.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-italic.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-outline.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-regular-center.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-regular-right.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-regular.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-shadow.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-strikethrough-center.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-strikethrough-right.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-strikethrough.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-underline-center.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-underline-right.webp create mode 100644 bin/unit_tests/assets/fontrendering/eepp-text-style-underline.webp diff --git a/bin/unit_tests/assets/fontrendering/eepp-text-style-bold.webp b/bin/unit_tests/assets/fontrendering/eepp-text-style-bold.webp new file mode 100644 index 0000000000000000000000000000000000000000..1e93aaaafb91edea71604e78899b27d425e06226 GIT binary patch literal 7990 zcmaKQWl&pdqb^=76sI@@ch^8^ad&rjcbB%f6^Bq(!7lQ<+`&~_>4vIwhHu#si-CeoXk=*VsZwDBnD+zGCO6i ziRTTf3@Lftwv4NIErmAM%gUj2jnr0hEtc!MMY14SU+cYtocQhrhkoLpj^M?t7OuJm zhouGwvucpd+|`Nk^ZhaDIA6Kt)h)r`AK~$b??zUuRaAFukq*>Si8Ff+;^vinA!Qk9 zPBMwiGKuzwPaS1J1>}EDIdeE{A)7(?!C*%Kwt(N zoi#pPc0Bpt&-Did{I83~@j`7+HQYPVC=@aY?gXmDu}srI7Nt>Uy+$1ff1|S(8+iG* zH|w~G7$2B`8P^;KTIkYYAtk+#0h$Knr0655jT8vgONO`9?*=4!wu-p!)h&r6gnp3E z_huS){x~$YoZ)y=vCWzOf?BDf=~(HrR=9E^m9)Q;c}@{sp3C{g!sIj6XNsKJbZnP%!LVZ1&#){E3%A1NW()5jbZMV1+A6eVpsNz9 zAj6u^ADPc)FTp8nGkL{;CrA1-$ksn%=fFI$Iu&gfRt@F%_yI*=ZzQ+naznOWC6I^6 zCXlxTmkAqT5sN&qbV>n5QYmZKp>0LEK9^e`r+JMmnk`_F31EGW-?RPZ5UFXD2xJ=8 zFsoi}s#TeBE^VAAv2k=H%vOcxG^~zf=_CMhsbR`EsLR8V=-F@NIsuKE&1PaOxyRID z>tsie$_#b|)LWZSH>~BB>BQD>=zYVN)1o^TA*h{}MohS*_ZM1lb*gtw%-FmXJ5z0U zzl~GQfE<6>@z^tS<}Z@4zzENw!Dc7He~u9wj7-FcX79|Z`Ou_z{f z|G5^>Ol;tJFv52f*7w(bE{V%z-GnY$lg#!cuDB|NFuMqft9?zV!kUfz5d@nj3H+qV zW0LEi;*Bvt9`u0XvyPG#9(>RPX}{RkaKw;Wx+RE(8^a--^BS<=BisM(YXvYq)cQqE z9DMrj;U?sSQyjneP3nn;35W4gCPYZm1ikt}<7>n3;5o2;CR4}|P8G=P(nS)p&>G(T zpK)GJd>TsFrA>P;u$ga_#{+8(_BL@Ma??q?=)C`XOn3vna@2Il&dA$75~n<3-}EMj z)%9vGTYcSL#*JxVh0(4RI!oS^laqJDoniSo{sjtayigSKX;2imN44Eno_*~xpo+>2 zdTiZkCw3)nT-!ZCTb2Fa68iST{*}Xwt3uZH9^dUU{YVYe zw8|Zpu2PsD5+I&V2lHFy?k*|7ypAtD zy2!6XmN{&ZGN1Au5IgU^Em}x;NwJv21l~E)N5TK;Vu-{)cTFd{g|ct$aeBd;)xDV~ zHxZ6(FanMr16s4)js-?LOLfqX;;Y5QO<${$ZzT;5-GM6DlyoZV${e!Lf>JsjAWsi_ z9gpd-xy2r^($XASk88iQo`g{5rt}`#&|P=Ye!;b$epT_tt6DMp(Yim(QSS*;@|_i% z!EzJaSfR)L^JxXIt!9{N7~!2S&ntsmf+2|WF+`6Fq$_B2QVAuMuY)LhJS@tas90zS`=@5#b;CBG=e z(0csmy0H5u016V`6HN97|p5Lp&%rZHBq zgS}))(*=pH_=m=X2S)M`!Ode<)I2I;o3p1Rf;)+YA0ojX7~BFgu|L-0kjTzZhmRrF zyB2uGFO{QRrQPzeiq!+9@fjq6jnXlJtRlFcM{0Y`{fox4c4TIEIg}uWr954@P@+F0 zWkhOZXh%dJO(|d+Q&vtwTS#!L!@G|`3CX0cmiP6&OWrG{>KnS)_R-xR{LUiy}Y`c%}|^^RoH8VdD+ zo9#9RTHv`);Hu9!=qds0CLTO$E9PP;%JrEvb_Jx~Y5(EjY(rfzVj?WVdtWQff!z!x zh$;mFbf`l}9|TB9IL*pC{}fc!aQO<6%rRW)^QyVEJ91i^Gkz5u-WZawkSz zw;49zFG2k?fd@;lN6#mo&N*Rzk7#c0Q(4q?jm}5#;LC0$q7nvJzAMY)*$e;)kLD?r zD)igY8CwEX}sxCVL`#S>Z zf=&niYI2C;`j5xpeNK}3aVk<13nIFirI?tVAEd;vQww^bdZ z`n??K45w5svdmZo@-a6$HPQ~#`dDR%IaRUV7RkaZ$QNUH&4l||mG$o|C@(b6Ru*^+xKxROcf1r{2jHn&cf z>~Xr91al4A8|#7q<&Eyb-fw;OoNNX8RcrJb1m6tygzA=S0=n5t81gYK%aj~0=e3R5 zu|$~gOC7*WqJ!_SfflL40Y8F=8Zi*BxDbjI(TA8X(X{C;UmGcCR;z+`)v@G`gy0?O zUo+~bCr4O%CMxW@#a$8?9eil`^TjF=)S&c6k_U>@Eq_^BNd`p1`CVt8T!}zKMHrF1 z>1Y7UtQL};5tch4gOz+}1TZ|zV`b9*O6pb?LF1Vn!n^cJjZCK1C;1=DodeaFI@8Z_ zAWsUDH^-7f??==#7a5V?$ajv*sx%-!Qkqk!Mzz)(!^1Sq;o^dRTJQ~h^kxZTWlGnY zA1ei>&if!O+LMd>sBKIr2kHcj)dUvk8$`KiqEET>V^E_PtVGc9Yz{Bi&x#@7zz3$r z)TZQ`&!mS)3!MBghj|by&YhQeeisIA)l2(pvVR4_bMI{0Aw5XCME4h$#ZorHK(F*QNxtzQyGRpH zz@$@M>Html>PSkSqM-4g|B99Op;C*l8`Qt~_ODje$M0KzKAC(YJ}rdGN4DEB(XCtU z09Q^JFnKIr?0fK6i&5FG7U|{U4l!TIY10Fd22d>#crB&`G0q$WDvylPwvZ@LDr?<$%gx~r@5zy7t*O);F?K`suZgVM)82<`^pD$? zYWJk#^&gXR0~=Qo0Y~fgcy--^Hhl>+*GT8G2De;Md7ui}KutL)Q9}j4s^;gY^#;1{3bVV+Uz!1W3W9dMbqp_!7B`;)V&r?b?l}aRZE1P z4E5ZXa%{s)9-YHiR%4jKm54ZUTvrF z2lr&-C!pj z^&lnO1X0mel%(DLz}R@?Y&ryE6ZofqUGli!Yh|ojuC%Ds$PfZQobl!bS>jhgOfNy+ z!i5pR7qJ9z>L;$N&jcH~5f%mRN!$?LRU)U-m9Pf3cT_3QQy%g1gNbxVQmIID!S2nWv9aNBJSZaiNTkHuW$hT< zilH8Eo!*Iy0YNt9@!vm|J2PL$cskIkaTs$5^v9%GYM9c1~z zcapuLHc7@+>iBf7tJ5Eov`~WeZHe^@93Mly=qYM-EdtZqIu<;Z0SZi`PsP(gq;JFX zKU061jC=NO;83T^`$l3~;*&OI6)10!17}7K1D*~|5owULzTfB-{P}zL&-l$Zx%tq5 zMy}<;8Qq`a>-;F1{;7IX_Z7e{0$i);UGOh~aMMeR{kVl`(F!;h9=s5Tla@%z+*)~M zw&rGj9cNBt&l!j!DSE{%X!5=8_U6aC2KSX?^wwnExVzc?E+NL%RAZ=BGtIWuEs2HV zV|KXqd5s%=oCSzi5iMa3$(9jr2{j_KWQnKT;)AcunoaF`A#Lx^S;ANFOdsQSB(BJ3 zyo#TfG+#6`H3Km^w+*T4uyAI&#?$SJ8h4c&7@rats)&-z+cn!$CK>j$|AG&!jGa+O zXn4Pa^uu#hFeBG+$_vc=Qns&0UsvbQx|vJD!>dcugT((j0fz}%OvAIjAra3}4zo~- z$nDW5*%F0<dk^w2idf3c19 zrN+WV_97vSCm?}pzpJ1{rSTdPxOx?< zAHC<$T9DzEopm0Cdyz^O&0RWFe60>}KC*y(8sIn_e17!n-4o|sKcK;2YD8ds%tr!s zb6={Hsr6lRXy`3W;AlzeQQLP$GL}o53p%64O@+}mO+SGsI62CylJMPwKx%^BgDN>< z*6c*4(PSPNm{j`9dw|zHSBspm z`NoDp)O1(A_OWkL3jFG~D*n;FSQ<{=HotJYiPEK67tE7_8SVKefTGj#lLw#H4sOxHmaU61E+iP$)TLRx5RKy6;mSZ!&Q&;-PZ5J z2elTSHYK`lj1(i=v-Qj*i}nqV`Ij1r^+@~^JQ=5sTu~N$&N}f3Xhf1QtgkR%Dm*qk zD6wUOV2nGxH0Z`BtnMhr3g<^<_6*K?V^#kG-D&;&#-Z`_s2UYm*lTEGCu_I>vF#V| zZ{=WFEZvu4r35LFHErf^TTQ`^lI1_=`)x&zK;w9)-rKq=^Pl#3_Ha|_H}3($Pa}4? z+{~!#x^K(U4%gc0=Vb+Iv{u0%w2C zR>qSTCYZa>BYF46T574iBERe*Zh7r@X1_ITy2xgw^`GPBjt#p9-n+?&Eh*zmr|}2C z)6hY!)#)8m`EWM$kk5ep2|hSL83pF5po@P6-|sLg%9G`IYLAk4pcz@2Fn_9pEw{U6xyDHCj#x=|DMHgFixU zw^6xdQJVG$UE{fB#{DgqP<4V<|Hg;*`NxpK?=|zuKxa<<$xxNX@2$hW)s{qmd`xR6 z*Yj@CzAuQ*D+GZ@bQQFVsc_*M3-uqqsYZ@xeJ-fd)!^GM#xt+xPNE_zo|MEIwDLp* zyNY@&#jq>&_rot?jOK45!FE*#ekddL7OY;#BRpOpf;3N?ZYeG^~mx_NfmSuCcvyfzVaNLR9W|Fd&u zlhJ#8`pUrVD|9HUq!Im(wH^kErp4T*69)U|{ugnJ8jV}UJm%H7rx9WGF)9dW83rN6 zUzAs-kOLT5NnhK8z70MA$QM^BU7p;HTgAAB>Ua$QK`SV5&~esIG8l%WL^0I?XElZo zESJB9p{JU9h>O)oVFm7qNxVb7?2i=lkfXXNZL$}tKAq6K<~w4M5=two*9f8(_6)a7 zmQrooRg6vnxrDDQrXq%`cvjMGrKY|FSE;MX_m8%6DxxUiDA9jyCZ2Zw5X)R%bEe^R zdUQ9Q%_FSeQ_)(ssqv&csn%PnU9W!I`okUT=e7&o_8WDFvcq@kDq!^D8o~U$`2zaF zXLp`d7b;Dn+O@|MwAXz4C?iW9yJ_0`fL}gSw;+}u`)&JTP7ZR|sYna;{-+%{uHJ*S zf|wfWVn}EKXHi%5s0@jj2Mxq|@!fdx^B4}UL1KAOQf!OT8OmXD@T6b1`=eqsso<|y z6yz@;WkAIWUB@9R{C4QnAsPecO&+I$k=o0jxD5FI;t z4`s69`KHJsQr<4M$#E;jk#6`?n@t57PK6puzU-Mf zd+00{07@o7DdDQNqWKa?qNZ56xSqw#D&=W9?{hU)c0xg4p?HE2jAqm1$;k$0D)d@A z(#P}S8ejQpMVbi4!K5x+O(||%H{4jG9??vz=b5W9 z_90_jPU1B=v=AEs`xg3v%U`kMdH{;ZB>)7G;uaK7H+eO@_9r6Zz96dOG3fRN6907f Me_fu2X<=dh5AD5|(*OVf literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/fontrendering/eepp-text-style-italic.webp b/bin/unit_tests/assets/fontrendering/eepp-text-style-italic.webp new file mode 100644 index 0000000000000000000000000000000000000000..b4035d13ae525214c1880b7a835c77922afc0e28 GIT binary patch literal 9404 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 literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/fontrendering/eepp-text-style-outline.webp b/bin/unit_tests/assets/fontrendering/eepp-text-style-outline.webp new file mode 100644 index 0000000000000000000000000000000000000000..7a34066b2a2d79e83f26d49a2b6d9f415b0a4cd0 GIT binary patch literal 10242 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 WdO7fwq_g8c-e~)u7u#d@qb3SeR``zunPh zX^!{;5n1A0F0KRu0pCSA#Eu*_$T@abUJjb1z9?ox{WS*zvsqFsO`*^ZF+JD0gj5E0vb7QM0701f(@ zVC+f(ip5FtlYB-i4UMulKKo`;X_HgaBRyVCdJKa)>P0_qmRa_tJ~t7Vg$@3QBOh3D z=KF#6&HmG=6=9BPBTG@vL9ohITPD>4#6T|2&W16>)bOV*ZALgNuIVOQ05GYmo-K?q zEzUbO950JeCYU6lipAI_YGQY>IMv1rA!4tM6E%)aF3vRKz6qbL1fU6XKz_$}6cM;2 z8%MwYc)F_meV7*V(fP<+s^5`LE{^^bC&()Z657Ga|6&P3>Qv&+BbqYbyZEk8c@|=~ z1b=zi>e)Cu35=RU?`YI#G-p~m&cpZGC}iUZs9~b^jP>5D8%^=P?($2govTtk6ff#i7qDGgxK;@X< z{fyXVM3CeP3x#_Y5

*lt*TAYkSbmky+;pady<0{^b0;4dDVSq?F;^XeHLRP!s(O zN!o~8bj0q4a^F-rU|Mneng=b9HP7BUThuBx}8Q&6_32o*{txE^O}S`tL2@n$M_Nxex>q;Lm9j| zRNqD2n<^GSKou+{O5L}>P#J2S3XCV*SL3^k%sSo66W6U$kH^X&DJ2@seM4fWN<>x7 zYk|k^U&n7QR0UvH>ZBj7XuioG%EHI0{B6KH!}*)zJJFoY2qu+njr(Wrh3IRun!Qoh zBuJ-F-9W!~LrvBiv1G#h3`)O2Q+*4xklA!hk{nC1j)6=MVmm>4DrmeyFIvV@prrFQ zgwP2~;%X2DMJvy7YSXJMjWY60XAMs)P!!X+L{80{1pf$u!XoC4#=`VVNKUG9zrmX} zPkAPlWyf&#EC9x?>Z`~Kw6KMg>VBfCItD14OjXw+l@^JDFE=Yx3>$x9Zn@$4EbfG` zArf9jhXZK|UCu8JZ`tjau+%UXxu5u6I9eTtw3aUxUe=ulr734A?FM`cQ_gKuTTI_E z(f;w0WJ`_g8Q|r_b)uB2F6HN*6ESZZ=CW<_qb&0m-&eUa~*(j z8QQrslJv(N719!e${8ryVfIPM_Vw?iT##DoFV5(=-@yD}BR*3?spmH&j`lGrsktA_rYf_&{>jR)hR{qp17^F?$)6aneqwdpMq*eK z=g*wq)dOuu_VBXM(cL7XtGnh_V#JJD55h!CLavv$ON%AI!Lp0rj3WHwGej^dVwcOf z@r)YB@Et!eqzkF8e-TSIm+JJB`)(yY?Bhb;Xn0L>mZ^|~FDew|cZ{J#TRq08aiAUKHjl1zAeDdJNKwl1G{yS_e2>EH7HV#i@h~|NTCgGkPvMQ=5y6jSu zuM|!2C^CgGYMykX7B3c;f_CO}IDZM|=w>s^Z)(td53^Uid=GY}?fcmcfowI0Fpgn= zkEG(xz@J;C$3Ym6pMCx*L|lk!b;rq%9tz`f)nOL z2Na{Y>;W#UTZN8(|EO1wVt;n8ik$EA8E z=p-n`hcYmf$Y`9m-P37Vqg`X|GOYHp25sbXWge+H9;nuG@z%;{)_q|DC#9)TK`M|Y zfs{$Vj*b6~K3&4m+bG7usfFl78}svCYMYVHnm}`Fr$m$a>v8GA0^S!|oJSB<5<%9+ zg!8F-oa^4yWrPr9QLe+IGuPKcVFwfhB^gt1ySgaVzXEf(yvfx*oKD+*tF!3x!*vvS4Q$E7pv(`}z^i15lB+3Kzdt<$kwMJUdL zRW!|SYsZ&kPz;I;ezk#3ikDDi&eIYc zDMyAlJs*0jwNYvHuIRTCFwFkk+yHjyS*m_TiEQo%<)ejY? z6r1hs4cb{{qf;`}k37c}u~&q0P}c$GR9fc?03y@M4cdBS=Cb&#NMFn=q2W9}WuTwzezf8EN2rH= zIxK^$Fk;7r*Q%6AsOR`G?$2g`zBcN0Jh~R;(a=(9$qjH^CxM>*eZkxcUk29pyFBf| z(jPyrf($sE6AQRE<}uF~`a!y;+u@{0$-;aTqq}IX$_a9Daw+!FaMZuP}=1Z5~cGy&JiHR!}qi${98+r zRm*YW)h}W(=aOTgcJDCekW@8+fzq+pxif^u67`c6oaS{^o2(KR0rb=vzV{1ruVO<% z#;oB#`JPjyRq>VLZOl{rCzxVCNxR|-pZ=6EW+*o>toVW&)CcgC6cG8`Oev0UwWG_S zOX#sZT=_~bB6;9u`J;LTF#zC=vd5MclsBb<3^E4Hihaf49nnsO zI{hBT%Zj34X4LzaKt=})83g9>wB7PP|9X$DVK5{OeioB10^l6-$vKEk>`hhUA7IDh z4^F1hmzyW9)gwJ8%z>8`r!0;aPT-Y2%dEHv-Akc+OD;V4k^g%vw|`2bRegaoN#}cp z@9HMxyAg9+?$o9Fe`9BbZ5bLvqW(Ko7QgokWdsF!7=gk%4n2>CNU+=z#T(~t3%U=U zAVwM!1YXy^jdbpj$)A*kGCU1J5aIq@_vvhl%AK6>_UeLYO}uzXzG(lt<;F_a4>xskv=wd> z%7DImwl~45?l|#Pi86w5Yga8x`9SH1vmOUBMugE5S92(=95+KcPU=4KT~oO!ghqvc zwucQTSs~eCaI!`w$OLXYiY`)4maLu4QOH8Edi&QzTf8DiG<#CS-TfhMjAUz1)lG_q zeofPF(%H}Lj+X`F4W*>r!O}cIV9dK>vu>@((PwhBzC+n7T0Bd!uU~+SlNF>iNpB|O z^R1%L`k-NBUq2vxkLB~%*>o69HeU!hXEPNa*!DPT_?8|RMYU%jFO`7gATKEL`JRG> zW6>aoNT~zT5hbA9GIYNO?<`=VAYREyWwlSw4C7HekJAK1pp(EI<|$N-*YHS zhRU^jQq*D+#@OBLm_3EGfE}32yE7R*7k&Y*3~P#HjXEy;^l3P2#)%P(rcI+O?HmnA z;acq4nmmJnMxhSwedTHGm+5DTep{`4*^CgNiL61(#AmJ{#+cAD(+3&S@S(gOM zwdwLzJC@}K+%`?CyyFO5i!K*6xrF-y+iof8yjy2(AV$O=fN@{4<+rF`hM+1QR>Gxz z9ik#L=M}tlS&%zmn!j4M%4(!SX#5(C3E_$JvUIg{OoTY~{0T8=3d&dLnAY6%QE#dY z`zge6&`?hXT4Nr4bwV5WLd17tq@#w>gLOszh~%YRg(_KOU>&=HwTk=@w2^KdM0;BD z(}odbI+beVX)vUKsz*A&UMW&TFsR+|%bT>6Ss^K~2;6;Fpl?v}dD5eqz07?03!w#$ zJDwaN%-qPCs}y~85P~n-BSmf-|6DygYtA=FM`o4`9PR%>a+UNAE=t|fEatbJG7dc3 z{5(ka!Gs!<$+9wD29RPV_g%U*eU>-o(u6L?dT30ccpz9F1 zWJG~}rvJXYZAuJJEP z!v*Gg=Wk$KE}P**il*nbc>?%$)63LvG*6*Vo>uh4r=Nm z*`1M&{|krHD-`*JvzsWUYX>F64R%}U{+niaH8OYsqkecj{vFqq@K?dx^SukO`=_Wy zB9?NYyL}G2qMWr~P(#|4e-FkhXWdM+lZ|dENAp9hj1v+08{9&xzgpbv0K9QhVDqnZ z%KsxWlOUlY`7{+4E23Xv5R>o!f_|O~1IfDopCWfUGMPLUqPd3pbxmgQ&SdeDW~cd` z7iTet4s{L0=8Hd^{6HB8lnJe6He6s3QA0b=3H^!4ZvyyXwBS z!|#n7RShw9{kvEmu*X^pU49F3565?pW8T~RIt$q;dRtZJbJBi?+h}NZr#y5fi2g16 z{t9J+%@~Id(RVdvVRgQ4Ej2;{E5oKxDh)?ASMf-%G-rgII$Irn7UY%8wgm(2-SxMn zteYF>U#%Q%8&ifhD7M%8)ULbg>x5B!TEWoVw2Kiavsjy!l+E0b6V3OO_p8{RBFE38 z{p`DnagvMzIxHNxI0k%YQ9J8#3ll6Tc2)UJwfa3m+)$UiZ@T}8CQpd!4X@!;lCT{^ z`PQSnT^-A`Dkf7g6VY!O_h;eHviZKbLz3I5jJdU!=F7m#J5-iY_UkC< zI~&wc3r*fdOm~<(H~AA=iM^E>zo6YFHs9nsaciFbc>|V(Pd(3zM^e7*29nNtWM$T| z`7sj#1O?+>UI_2}08SPYwLGr?wYPY;aYerVpVZOZzCrX32MTAIAEYO@geF8)W@gEu z66~$)@C%iQSePQM<&0qmIA&MB-!)TQTSwASkEyJH_5~qv*rV4CRrG4(CBKwaFKW*+X zG_V`3*UUjz(jJLx5*&4A?JTF_b0dYMnp%mtaYu98k-9(BNAB@X5_LFH(-O7GcPBYm zQHOFpActQ-x|4}VTS&lbLt&6GYsq0E6by*^;=5u^}LxGP!NRMtABuCPC%v}AS183*|!&XL`XZkYYeg2H3ws<^_{9nUBrt5>x;vwT8 zaLi8o_XZCe7Z8l`mb(?o=1Ki!ydW}HF(vN~Crb#Qe0-UT7R!8lHz0^F`MAN7^We7U z$D}n48=|Lrgu8U7HUw2iOrZJf3jprv{aUC(W&3SyJw-GqS)z9?odIWCsg@Z@NS$&2 zq3d;YH!9zC=pO3OuL}uDvf(TJ8e&)2=0~eq+(iH8qMkYFPA(!6Val{8nuU0s(NySA zWqT|BEft-*nt)apIN<{|+z1gqkKzYWH&P#I6u42>bdH?OKQr}XDx5*i^O zt&1mCu=b`=mZbODw|tXo;)kAxQD6J6f~RAXQd^HeU2&Wj6W0F^k;qP-Sn%;IoV5~h z0Y*cl)O0Tv`|%YAE88Nl(Kq~~QLQi=5h9FHH6cSdc2}Xklp9vL<`AHtJL4DFFxQqlFXTjsOdus9Mj=oo#h)0Ezw z)^_;THK;Hub%Et!B}Gh(?0_!aWT#E=KHOA}#|v@cYI(Pc+_5Qzqbik^vX{%~b4{(x z*UH8m4v*IrSR4qduyT^>O+*Q8ocg*hDP!KIdSdby1oixM$Pr=HB%}>&S$LQ~w3yWk z?E*}Pw|8Jhbll#d5e_KUM_dy6f!@;G)dr1=$v{sU?(3j9Jfgy_rrc7h&WITX*ACGD zI|sxtc|Ayl;9_ul3ne3d+Mk}5l6xgeYZ`5tbOtBV#-mKUNEjGkf10nn^lV@ph1=Y< zoFnAa0k2FVit@gXpD+Vyo>&fro*BCi=$|VaUT`8*-uN{I zJ<)N~Ks_xVxg2a{(1`FXRN|A|nN@jsy6PStem7_>c|{c(yo@u`P|o*q{Z9he{B2Q$ z=b#qB*74+w+ATD=d-$ciOme#N1f|`daf1>LLapYP^Y<7M%V^6>M#hyXt>uyg=*va| zr@*l4*A0;d);(EgpWR+VuE|uI=;^(3oLE-C5gVfVL9Bbd0xAZ>>a95>Ux>?y%s$B~ zmL>PTiXYe~SeXFC_6w;w^@s+Hv>|jyJsBrT+rMLx0<}|`UzGU^DQxq&6av;(GFADRr^-mM0oSn#$=>MP9oCoHH6)X*-)VSvot@% zu=6*KTmy(F$6Tz&)k4_QBb}&`dI~h7K|?*ff&9+$_6b#|H;X7sLmBcLV|@4#bckiy zRC;4n7xCpxy-Pb_c4{+9C^`e3qH>?h2R+%&%_tGBlRt`~i7Bq_d{|CjLJ2E%wk1~B zY}@N=2{t43Stwu3AGd@|m7x!0ju)!^;f?C1MTfg>K7_m7?JCJUq-kAzrZ#KzG{$Wg zMfaNEJOrGX<+H!0$ldxONk$E)q3%7k0NvkSXRu9@prjoyZjM`SpRoP|;B#W~@XGCX z?Szpg;6KipCxkuSZs*n*vO1xjk^^Yprvgqa6~dpELrR%=D{jms%vlPI>iA}R6+7S& z=udjvj?`P4Zyl$FOjbtm(*zZ>0KUnd&3q=%iGnRXyV_Cf?{`VU*#3|RK>J63DuP9+4E!L=c zyW%1D9UbYDt#X>-HGEs193CyZ#1+k__t0|Q^uik3(lBOkQ%zgMz#^Hj5y~&<0%_B# zs%d8KD0j9u-{&z}9ot5^iAyf|2flg&T*bW7_gyoXk`%u_g8WXr_)!*NB6b~0Xyy6J zUN2jzh^KmhsQL_#nz`k4ANZ~EoRt!W!EB`6x|dg2&!rl|eTeWZ_ei4tNOzZ*sZ^lD z=CTfO37P5o&fLo}p<~4pEL0X%urnZ!^Di*6-t{AO!1b1KqxOWq!d%R-z3(mmYAb(tl92GIlqEhTZ_AlEK1JZx89` zEJh0fcaEfq+6(@N{mjkL6n$iU0jZt|%hZrR6~I<~2A9ZQp!5xqfx&V(tVtaGBwMZh zr&1PTai7_liX9S%@{a5F`rb$W3zmj=wiiZ(J`M8l`4L9M zvNy^|AhEvFtB{XWT?!ks_6Ph?-xY7(Gh>%SOK7HB~s@kssZF*KumDC|lh*i&*f2~6|Su>oM z40q4)O&h${`h!yoUB}L{L_5fKf`RGkGujDt@!74bVvhyC1X%2j$<(aJfYVXWVcl0B z^-+UweKLO4BI@?CgDcZ>M*W`>V`oC(4fGQk1UfzHIy_fRm@7A7@&QBvJg-#y2Z2qW zHX-ZnuzJjgBFpytqUJF&*x@%Lv5VqD_>x>M3D)e0(15Z2Zr}iBvm+YD(&9_`{!ewF z<||)vLWAJ!g)lf~;&X4GM}LNJ?E-T}asj`ON(wEsXNAFb4uy z?`X5NM#V;b{95w!v)3rZ{HGNN2qi{_PyS1kJRd@BekJmYglh_q*lcp4n8)}jRs{XO zwAD2dgyovdq9f57V*ql5jCYq!a(e?_GRp1#K5hBNb7mR2!5z6L7b8`0C&j`!pPNW+ zKrK|YN|0*qBw~mGM2MY|6aKQ*v!5!CP2*GR{v5l8x=Mj!PrZ=FxR*cyUz!ecicx}} z`Il#rMtbEY7nYN_NHtZ`F257F#v_c z{I-R9h&7E)eY&qG!**p1Kt9ppx3sL4kJp2gwl6UP@?sr)XeF32Go2~fr#g**%pgzns;@ z4lC>_N0+f!)K7bh2N)R2&v@BfUt3eJYz%XJqFT9N)7bA7x~%NL7v`)vILA327Lqpg zIKLcf0wl%m;A4X3*950Tik4DoR;Jv$f1v3(vCS6XP|iFb0lH5RxA-!|FgN(tLrjAX zzwlRi=TmFo;#B8bcqw;++kFYiII#h#NS?O)i z`_5*OX4ZdMStPRK?^qFGo>AQ@Aa_xM1jyr1og3?h-Je3e@P{ugCKC3{=P)v&>_#D?}lG!b4fto zT#pU4u3#0R08#bSnvlLleT-2US|04!31<;RF=@+`cy2}-)wu?(QO8;Lj4qxCE`*k< z$2xSg`Lm3psU$p(Rm>+EYjs_+^)u=oKyY0#?NM7sPJl=uRwGEid+F zqrzoIUId0oHsWke_gOJilSZ5JO3e5`>-<-0nIO_X-8B-zes7#6X-V^I9xqMUjvB9U zTx6;Fx7e`qrH&{LlvZHaQ1qC93|Z{w=mG{?Elj7v6_)E-AY!0R!Q?BQR@^q^N0k@(QH6DAd2Rr^gS`#KxB+*mHiE+^S6=X}f_@&Z-)$cLqy9s7 zOBa{$tnA!y^VJ7PMSZGPn-=k1KdW=dM_K4YecXL$@+qcOG*}GI%f~U0v-s-!O(jsY z^P8NZzG}ej;r(UygV8#ZTnQk9L($~2es9zt{WGpV&bum8r596e%jO>RGd?28Rc4pF zHRS=Oiiz?XeAb_Ly|q7oZe-D=Cb01`NYPe@l*;cdt-S3z6{qBB;0;ErS)o#BFYGq2@XtzuQAeGQ|WU4r~m zMru>5F?XTzu2B&kptECC=0$GndY!b3BU66C=MJsgO@q^US&4bHmld@s+c&YLkXqBm zPwI)ru0KO2J#_+Ahb!k?Oj_C^bqy(~qBsc5&#M+A8MifT!L9L#s4s%OwwAql0>zqT zd2@S%8U_I7P|>e5d9yCKyL6KX$%E=yl?f@PqZxL2CApBoi*I#n4H149x&9p~2thNJ zpBTNru$dM~UP^G+r*dNvh3WKq+uiBZ&MB^dg9!_1pmN(Gn%Vg+NQx$p>UBSx)c!y%tT-v4 z40HEOXn-_?c|4m7^o@ys%lFRl?r5dz4v(!V#ZM63$;7_2W`j*b$BglPu2u6|7|cik zYz_uxrOlawO5nt?Jt^sxH&P7zdl?3rnfy~@T3Qg#by$@h6aDxxXbrLYd|L7eR-!gn z44jrm46#iAZ)Q!yzN*-5G2I;;rg@T=GV6++*j?;vEtB``nven)ASmJyLRUc-8yh$3 zCncdByMo=gww#(u-E0D*iIu`%Xjh@>2-)I^tk1HV!c_C*$?*D4d0$tiY-qcF0b=kj z33j7Tvx5UVh`d!`(<9U+*Nr|MJV7Z&XbPp~0Zqry*$Z_{FTTrZBCq!J$EiGQK+-eO}}z zp*?L88b4g3>pkPVFp5Vlk$+?S^)UluA$>~!))R_?^ufWXLlvikhB0B*8&y{dGZ!)U zC}>f4sDbKcgFfdZK0COwIC3c?iqXi3`2FTB(Tjzil+!B6yY=Yz&+=rsvNg#*KZeNt zEHP)yZdKwa^OrskOFWFc4QYi~sn3-w2buQ>RT!7eDXxMe3DF!0T)4?6G0p;spCeXH zvR_|@!ab+*h3rZguZoKVMO~1|I;l;c(x~ppgfK*HbvMbXJ)pR5`0b4xrvPSX?Kcje zFC8Zr?b{j&IIh=t?c}2WK-wKd&I@+oS_sU1zr4(8b!%TbcnAs0%fRRHn#IISA^Qra zrnaP^Hht7fLcGsPak_o=d>ZbW9PRDyw+~Xiey}ez12W9(9frOeNT3jeWPIn4Jyp;> zQ<>@t>z z-L~GYiuc8TW1Q*~WJbO{2oDd-rhN(z^CG*O!`U0bR=bYzoeYe5|7Ij?%pTXvVRelw zi~H#UdSuJ?gB9V9Zc*Yd+AZ;i)xztK?}>{g>C!bugGKXo6HLP+l8X$qUWqUY*MTdT z1@$3w9kTCv-jZjy^)Z(Syy$!HK2NYM50jx3`JiJzYxjeP%GS^PA_a{~w)D||+B`F8 zCMnOq!LTMG0fo1bl%n3~;~2PvPqMS!Fva1gdPuboPIc3CeW7-o#L!BR<6?xf^oTVr zFdrp6i%3nM1!@kdHisQIg^^jCvbAeeiMTiuvmLBmFBnLJOrF3OvGp{?r>1WxV%nLi zGK;biIp|*UaH+OW(M9Cx@=Wd3VLNaCAaZ#Emr0bM#`JvhFK0eU`^% z1}b}Oj>tMZDuHok-xTYsCXuwn5ns6E^HLW*ag#P;x%$5T)-&d-=WUBj9C$dp(Od@>{O-E*mlV!2W3L_h#igA2x`z}mXz3o?95`Pkp^JO*eD4LDmk5HRYVjBR~hinaq4Q^_~i zJ4HKn5@$)AgLng|zXAjM5Lz9AbO^bme=42C+#M^O|J0s|PGjsubR{pZJv8h%{ilOz zfu@Q-v|YAXD@a;yggJU8k$Dynxkr?{16IG+$6AcusFOe>qYhvOJ^ro?T>q!A8__mW zSP3c2?}bZw6U{jn$3nZyS=V>F9Sd1ydDu#R5U^Rc<+b4!=KK7R@p8F9SJ1ZCz6FSW z@hiaN*SE_=2~?gmvsf_%>@(S*3S3P-7TGm8yA?O4{a*E8U-zI9AnzL#t_W zycuSb(zrkvfN>6K*Cf|#w>yq*rR4*VD>#Tv^kVy-oD-oc7U;iV{Ua_ImvjimNAzF~ zxX{!XGEh`J3ggAJ13Os}<@Zz=cV+c-0=lZE{*ir|(pb%ZY(^1Xx>6gwPTyhlFTuTY zBHn)sw(MCDusr-`#z&$u@ldiSL{FpsOb_7)zO2R?UrQ@DXICeuGHgAf-ym^zdZ(4a zp=245+R=cm$^pa0vTiD2Gnz^tFEn|TkfWU`5OM;8y|26(IoY6Z1>~YxTQVh%iI`En zjSroocVspEIWC}#jvZoIN+yxtvi1#^oBi##l4JWS%aIvrI;UdkVEUj)wl8P7Kh(6r z1eqN-Fj!-BTDcq{wwa&?0|opMsnmvw0+_lptXhD}xJx^SM+o7wDm_TKv~ZNq_oGad zy!Bs7`U;hK7K6<2S9je&7XFYmdWH)=llL?VuntF%G@mZ!uyoy&BDf8P&(7(;^E?&6 z_!BvZhm2q7&Q3zwo9sXy5?{lGC0?8LjuwU0>T;_{)<05=0wL?q2q2Yt5^;d!4#(`M zgK7~oni9BfCw6>&?bWovu+E3X)v6ungVlN1%a?m8jf6O5*;!E|4JHe*^yUT zh6jG4qdR0y(r;++dqF_iGNEI8<`?wAEZ`r>%J%+sBb1dNj%O+ibG$a&k}UZE0;2HznO>1kroqsoza>9zGa!*%GK?T+96;E4fY{2Atb{n11Df{B>B z`JFg$dE#~lC-DCG;r-o@hcPzq=>UT+gkYNlmg=X7*jUuOAj7|PVK9b`FiDv_4e6SuXK zGPYMlA=Tk$Yl+*M%SF!&rmDmmd8~0m96i8`LO01swUMg?vUXSJcIpRoz!T7TWHQaI zHr;-Enh~z4ut=90qgolf)w?Xj?OwMuPUd)xFh?h64L|wXHS(F=kzu;9LQ@0w6F2X@Cs+2Pu6uqzB)7i80)Oaim|DCk) zQ!OCg%-sh%W{E;2m`idv7jXt#h>wQMKkV=Gnwyk}*=ZU1A2Rlra_w5z?442g>fdn8 z7m_B$d1#d9)PK_p_wH3=*_^K{tvegCAz&2Mu5xh`k=CnSWn55C3uYt5+`CtK=I|`` zWORe!gZE*Uz>rg%5F8x%!!8@|;N(d71=;@XOUW`xp+V`isNo|5QcdCxYO8Us*O>&x!^YOe zQ;&bSK63ktIpG7HT0*fhOocmU8z@UmgIa?foUEGhPNTC`hwF#*cG;1|L??d%3kiSB z<(PZoHXRi95BDmQ`#_m8(%?IB#w>gMCjjtuQ!U{*u%YG3(+p5dNcnLuu#X08f=KBw zwWG7i;r(TU$Elq;MQmECGhYQeKO5V_oxolZ5e`B@C{g17d({zMVdlAbG#E=54?~28Ud~6yXL^{9ws@%E^mq07a2b7a{RO_ z?O*pOxh!N4Imm&X?eL7Xml*F~RFCvH3zGocXCz>KrR-E93&Is>&g0nU2Dm$U7U2 zo^yLQN`HK0zyv#ImGfpjGiDoo+PH$UGp;DmRWgLZgQH{bHd<@qQuiWI+3r9pfZ36* zw*%BqLO0KYvPtpkW4iN?3WW54$P69{Fe@w89Ym@4AFIt!tN3g;0m-}5ytdAQwM+kp z7wn~vYP~h{Y9mfGY{DmZiWx=U(t8S?UKvD=Nk*?1=-7qQ5PG%K{mYZB4UcKp?9a}* zij0#$Sc6_p_V9GA1**6(!(5*527}|=lfxC4NmyPffbst#HzARUN+wZI)OOM57M{GG z2AgAZTV8IH@=5)*1mQ-BR2c_Wm6hJKNuPi=@;X?O% z$+1p7c5xh;(~pp(hI#G6!xWo0U!#|^UG5h60 zvgn(BnxguCvPr#6z2`XIO#2CWDDclA@jr)p|Kkkd)>+duJ9oy}ot*#Nexp^_4UcH z2q^|fe}I3Dbc%3t^y>2agi3#1m6(&C%1)+cyw>GLqB9K-l2SCuLsgd2BwR+(DLzdC zzns{kQ`F%+W!iP%u09tbSSLE`^Xjq5s^>|dNekmD9x&+s^aFLZCcb6gA{o|@&D11o z_I02Y=i8mRjxcIh_3~h9$`Tj5OFRq|d=|M?73eA$l=X&z&P0qobsRv~ht8ftSl9O9rhwt^ z>^Y$8VjB~)F#wcj4;JD^(mw-+IusMb@ygoF)=lNcY?{pu*M_0cC;1Ex;7E8p!((Fw5Xtx6TJ8(|k08Zvrond`rJ zI&^Mdl}V(#zRJwjtrCM9H7a6UVs#&~j;FmA0r)hCj39eGj0sT6;KuHjY{VwBFY1IU zh%Y{`v{ur{6zHlH)8U*x>2vAtQqhEcKt>?gbq`9s#!nP|%|z21tM%7E`!3LG=b-uP zBBY%FbA#QeC>NWI`P|(h-F0attGH5@nKNK!{M`usZ Y9n1dy`EYwvQSor|U$+Nv1PaRk1IYgJ@Bjb+ literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/fontrendering/eepp-text-style-regular.webp b/bin/unit_tests/assets/fontrendering/eepp-text-style-regular.webp new file mode 100644 index 0000000000000000000000000000000000000000..e83f9611d645690a1388c22b09703e2b7c547102 GIT binary patch literal 7870 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 V`O)={n=h*!|NXJGi?AQ>e*p7a^9}$2 literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/fontrendering/eepp-text-style-shadow.webp b/bin/unit_tests/assets/fontrendering/eepp-text-style-shadow.webp new file mode 100644 index 0000000000000000000000000000000000000000..03d4c8733aba41619fdc4408811e0afbfd32be0b GIT binary patch literal 8994 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 Qzy90(`vdQ`niTzi0KhIERsaA1 literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/fontrendering/eepp-text-style-strikethrough.webp b/bin/unit_tests/assets/fontrendering/eepp-text-style-strikethrough.webp new file mode 100644 index 0000000000000000000000000000000000000000..4252f58460998404ec41701ec8bda3e315d58887 GIT binary patch literal 7438 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 literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/fontrendering/eepp-text-style-underline-center.webp b/bin/unit_tests/assets/fontrendering/eepp-text-style-underline-center.webp new file mode 100644 index 0000000000000000000000000000000000000000..3827dadd744ca54230f036c89096576ec494f7e9 GIT binary patch literal 7834 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 literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/fontrendering/eepp-text-style-underline-right.webp b/bin/unit_tests/assets/fontrendering/eepp-text-style-underline-right.webp new file mode 100644 index 0000000000000000000000000000000000000000..b6f13bc995c3d78e05a80b6ddb9bbd42eebd82ec GIT binary patch literal 7836 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 literal 0 HcmV?d00001 diff --git a/bin/unit_tests/assets/fontrendering/eepp-text-style-underline.webp b/bin/unit_tests/assets/fontrendering/eepp-text-style-underline.webp new file mode 100644 index 0000000000000000000000000000000000000000..c158b5cd81b0eed80a32f96c6a232d5fda158797 GIT binary patch literal 7888 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 tabOffset = {} ); + std::optional tabOffset = {}, + Uint32 textDrawHints = 0 ); static Vector2f findCharacterPos( std::size_t index, Font* font, const Uint32& fontSize, const String& string, const Uint32& style, const Uint32& tabWidth = 4, const Float& outlineThickness = 0.f, std::optional tabOffset = {}, - bool allowNewLine = true ); + bool allowNewLine = true, + Uint32 textDrawHints = 0 ); static std::size_t findLastCharPosWithinLength( Font* font, const Uint32& fontSize, const String& string, Float maxWidth, diff --git a/src/eepp/graphics/text.cpp b/src/eepp/graphics/text.cpp index 735330db4..20141fffe 100644 --- a/src/eepp/graphics/text.cpp +++ b/src/eepp/graphics/text.cpp @@ -84,14 +84,6 @@ shapeAndRun( const String& string, FontTrueType* font, Uint32 characterSize, Uin hb_buffer_destroy( hbBuffer ); return completeRun; } - -static bool -shapeAndRun( const String& string, const FontStyleConfig& config, - const std::function& cb ) { - return shapeAndRun( string, static_cast( config.Font ), config.CharacterSize, - config.Style, config.OutlineThickness, cb ); -} #endif // New helper function to identify scripts where our custom kerning is safe to apply. @@ -101,6 +93,10 @@ static inline bool isSimpleScript( hb_script_t script ) { script == HB_SCRIPT_INVALID; } +static inline bool canSkipShaping( Uint32 textDrawHints ) { + return Text::TextShaperOptimizations && ( textDrawHints & TextHints::AllAscii ) != 0; +} + template TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uint32& characterSize, const Uint32& style, const Uint32& tabWidth, @@ -121,7 +117,8 @@ TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uin Float maxWidth = 0; #ifdef EE_TEXT_SHAPER_ENABLED - if ( Text::TextShaperEnabled && font->getType() == FontType::TTF ) { + if ( Text::TextShaperEnabled && font->getType() == FontType::TTF && + !canSkipShaping( textDrawHints ) ) { FontTrueType* rFont = static_cast( font ); shapeAndRun( string, rFont, characterSize, style, outlineThickness, @@ -157,9 +154,11 @@ TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uin Glyph currentGlyph = currentRunFont->getGlyphByIndex( glyphInfo[i].codepoint, characterSize, bold, italic, outlineThickness ); - pen.x += currentRunFont->getKerningFromGlyphIndex( - prevGlyphIndex, glyphInfo[i].codepoint, characterSize, bold, italic, - outlineThickness ); + if ( ch != '\n' && ch != '\r' ) { + pen.x += currentRunFont->getKerningFromGlyphIndex( + prevGlyphIndex, glyphInfo[i].codepoint, characterSize, bold, italic, + outlineThickness ); + } ShapedGlyph sg; sg.font = currentRunFont; @@ -234,7 +233,7 @@ TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uin continue; } if ( curChar == '\r' ) { - prevChar = curChar; + prevChar = 0; continue; } @@ -255,6 +254,8 @@ TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uin } ShapedGlyph sg; + sg.font = static_cast( font ); + sg.glyphIndex = sg.font->getGlyphIndex( curChar ); sg.stringIndex = i; sg.position = pen; pen.x += @@ -263,6 +264,10 @@ TextLayout TextLayouter::layout( const StringType& string, Font* font, const Uin } } + // pen.y doesn't have the last line height counted unless the last run ended with a new line + if ( string[string.size() - 1] != '\n' ) + pen.y += vspace; + result.linesWidth.push_back( pen.x ); maxWidth = eemax( maxWidth, pen.x ); result.size = { maxWidth, pen.y }; @@ -404,6 +409,7 @@ Float Text::tabAdvance( Float hspace, Uint32 tabWidth, std::optional tabO } bool Text::TextShaperEnabled = false; +bool Text::TextShaperOptimizations = true; Uint32 Text::GlobalInvalidationId = 0; std::string Text::styleFlagToString( const Uint32& flags ) { @@ -674,8 +680,8 @@ Sizef Text::draw( const StringType& string, const Vector2f& pos, Font* font, Flo BR->setTexture( fontTexture, fontTexture->getCoordinateType() ); #ifdef EE_TEXT_SHAPER_ENABLED - if ( TextShaperEnabled /* && !( textDrawHints & TextHints::AllAscii ) */ && - font->getType() == FontType::TTF ) { + if ( TextShaperEnabled && font->getType() == FontType::TTF && + !canSkipShaping( textDrawHints ) ) { FontTrueType* rFont = static_cast( font ); auto layout = TextLayouter::layout( string, rFont, fontSize, style, tabWidth, @@ -914,7 +920,7 @@ bool Text::wrapText( Font* font, const Uint32& fontSize, StringType& string, con tWordWidth += fCharWidth; x += fCharWidth; - if ( *tChar != '\r' ) { + if ( *tChar != '\n' && *tChar != '\r' ) { tWordWidth += font->getKerning( prevChar, *tChar, fontSize, bold, italic, outlineThickness ); prevChar = *tChar; @@ -1284,8 +1290,8 @@ Float Text::getTextWidth( Font* font, const Uint32& fontSize, const StringType& } #ifdef EE_TEXT_SHAPER_ENABLED - if ( TextShaperEnabled /* && !( textDrawHints & TextHints::AllAscii ) */ && - font->getType() == FontType::TTF ) { + if ( TextShaperEnabled && font->getType() == FontType::TTF && + !canSkipShaping( textDrawHints ) ) { return TextLayouter::layout( string, static_cast( font ), fontSize, style, tabWidth, outlineThickness, tabOffset, textDrawHints ) .size.getWidth(); @@ -1299,6 +1305,8 @@ Float Text::getTextWidth( Font* font, const Uint32& fontSize, const StringType& width += tabAdvance( hspace, tabWidth, tabOffset ? *tabOffset + width : tabOffset ); } else if ( codepoint == '\n' ) { width = 0; + prevChar = 0; + continue; } else if ( codepoint != '\r' ) { width += font->getKerning( prevChar, codepoint, fontSize, bold, italic, outlineThickness ); @@ -1327,50 +1335,18 @@ Text::findLastCharPosWithinLength( Font* font, const Uint32& fontSize, const Str #ifdef EE_TEXT_SHAPER_ENABLED if ( TextShaperEnabled && font->getType() == FontType::TTF ) { - FontTrueType* rFont = static_cast( font ); - std::size_t it = 0; - std::size_t pos = 0; - bool completeRun = shapeAndRun( - string, rFont, fontSize, style, outlineThickness, - [&]( hb_glyph_info_t* glyphInfo, hb_glyph_position_t*, Uint32 glyphCount, - const hb_segment_properties_t&, TextShapeRun& run ) { - FontTrueType* font = run.font(); - Uint32 prevGlyphIndex = 0; - - for ( std::size_t i = 0; i < glyphCount; ++i ) { - hb_glyph_info_t curGlyph = glyphInfo[i]; - auto curChar = string[run.pos() + curGlyph.cluster]; - - if ( curChar == '\t' ) { - width += tabAdvance( hspace, tabWidth, - tabOffset ? *tabOffset + width : tabOffset ); - } else { - Glyph glyph = - font->getGlyphByIndex( curGlyph.codepoint, fontSize, bold, italic, - outlineThickness, rFont->getPage( fontSize ) ); - - width += rFont->getKerningFromGlyphIndex( prevGlyphIndex, - curGlyph.codepoint, fontSize, - bold, italic, outlineThickness ); - - width += font->isColorEmojiFont() && ' ' != curChar ? glyph.size.getWidth() - : glyph.advance; - } - - if ( width > maxWidth ) { - pos = it > 0 ? it - 1 : 0; - return false; - } - - prevGlyphIndex = curGlyph.codepoint; - it++; - } - if ( run.runIsNewLine() ) - width = 0; - return true; - } ); - return completeRun ? ( width <= maxWidth ? string.size() : eemax( (size_t)0, it - 1 ) ) - : pos; + auto layout = + TextLayouter::layout( string, static_cast( font ), fontSize, style, + tabWidth, outlineThickness, tabOffset /* , textDrawHints */ ); + size_t lastStringIndex = 0; + for ( const ShapedGlyph& sg : layout.shapedGlyphs ) { + Glyph metrics = + sg.font->getGlyphByIndex( sg.glyphIndex, fontSize, bold, italic, outlineThickness ); + if ( sg.position.x + metrics.advance > maxWidth ) + return lastStringIndex; + lastStringIndex = sg.stringIndex; + } + return string.size(); } #endif @@ -1396,7 +1372,7 @@ Text::findLastCharPosWithinLength( Font* font, const Uint32& fontSize, const Str Vector2f Text::findCharacterPos( std::size_t index, Font* font, const Uint32& fontSize, const String& string, const Uint32& style, const Uint32& tabWidth, const Float& outlineThickness, std::optional tabOffset, - bool allowNewLine ) { + bool allowNewLine, Uint32 textDrawHints ) { // Make sure that we have a valid font if ( !font ) return Vector2f(); @@ -1416,59 +1392,42 @@ Vector2f Text::findCharacterPos( std::size_t index, Font* font, const Uint32& fo Vector2f position; #ifdef EE_TEXT_SHAPER_ENABLED - if ( TextShaperEnabled && font->getType() == FontType::TTF ) { - FontTrueType* rFont = static_cast( font ); - std::size_t curPos = 0; - shapeAndRun( string, rFont, fontSize, style, outlineThickness, - [&]( hb_glyph_info_t* glyphInfo, hb_glyph_position_t*, Uint32 glyphCount, - const hb_segment_properties_t&, TextShapeRun& run ) { - curPos = run.pos(); + if ( TextShaperEnabled && font->getType() == FontType::TTF && + !canSkipShaping( textDrawHints ) ) { + auto layout = TextLayouter::layout( string, font, fontSize, style, tabWidth, + outlineThickness, tabOffset ); + Uint32 maxStringIndex = 0; + Uint32 closestDist = std::numeric_limits::max(); - if ( index == curPos ) - return false; + const ShapedGlyph* msg = nullptr; + const ShapedGlyph* csg = nullptr; - FontTrueType* font = run.font(); - Uint32 prevGlyphIndex = 0; + for ( const ShapedGlyph& sg : layout.shapedGlyphs ) { + if ( sg.stringIndex >= maxStringIndex ) { + maxStringIndex = std::max( maxStringIndex, sg.stringIndex ); + msg = &sg; + } - for ( std::size_t i = 0; i < glyphCount; ++i ) { - hb_glyph_info_t curGlyph = glyphInfo[i]; - curPos = run.pos() + curGlyph.cluster; + auto dist = std::abs( (Int64)index - (Int64)sg.stringIndex ); + if ( dist < closestDist ) { + closestDist = dist; + csg = &sg; + } - if ( curPos >= index ) - return false; + if ( sg.stringIndex == index ) + return sg.position.trunc(); + } - auto curChar = string[curPos]; + if ( !layout.shapedGlyphs.empty() && index >= maxStringIndex + 1 && msg ) { + Glyph metrics = msg->font->getGlyphByIndex( msg->glyphIndex, fontSize, bold, italic, + outlineThickness ); + return ( msg->position + Vector2f{ metrics.advance, 0 } ).trunc(); + } - if ( curChar == '\t' ) { - position.x += - tabAdvance( hspace, tabWidth, - tabOffset ? *tabOffset + position.x : tabOffset ); - } else { - Glyph glyph = font->getGlyphByIndex( - curGlyph.codepoint, fontSize, bold, italic, outlineThickness, - rFont->getPage( fontSize ) ); + if ( csg && closestDist != std::numeric_limits::max() ) { + return csg->position.trunc(); + } - position.x += rFont->getKerningFromGlyphIndex( - prevGlyphIndex, curGlyph.codepoint, fontSize, bold, italic, - outlineThickness ); - - position.x += font->isColorEmojiFont() && ' ' != curChar - ? glyph.size.getWidth() - : glyph.advance; - } - - prevGlyphIndex = curGlyph.codepoint; - if ( curPos >= index ) - return false; - } - - if ( run.runIsNewLine() && allowNewLine ) { - position.x = 0; - position.y = vspace; - } - - return true; - } ); return position; } #endif @@ -1518,7 +1477,7 @@ Vector2f Text::findCharacterPos( std::size_t index, Font* font, const Uint32& fo Int32 Text::findCharacterFromPos( const Vector2i& pos, bool returnNearest, Font* font, const Uint32& fontSize, const String& string, const Uint32& style, const Uint32& tabWidth, const Float& outlineThickness, - std::optional tabOffset ) { + std::optional tabOffset, Uint32 textDrawHints ) { if ( NULL == font ) return 0; @@ -1538,79 +1497,80 @@ Int32 Text::findCharacterFromPos( const Vector2i& pos, bool returnNearest, Font* font->getGlyph( L' ', fontSize, bold, italic, outlineThickness ).advance ); #ifdef EE_TEXT_SHAPER_ENABLED - if ( TextShaperEnabled && font->getType() == FontType::TTF ) { - FontTrueType* rFont = static_cast( font ); - bool completeRun = shapeAndRun( - string, rFont, fontSize, style, outlineThickness, - [&]( hb_glyph_info_t* glyphInfo, hb_glyph_position_t*, Uint32 glyphCount, - const hb_segment_properties_t&, TextShapeRun& run ) { - FontTrueType* font = run.font(); - Uint32 prevGlyphIndex = 0; + if ( TextShaperEnabled && font->getType() == FontType::TTF && + !canSkipShaping( textDrawHints ) ) { + auto layout = TextLayouter::layout( string, font, fontSize, style, tabWidth, + outlineThickness, tabOffset ); + auto sgs = layout.shapedGlyphs.size(); + if ( sgs == 0 ) + return 0; - for ( std::size_t i = 0; i < glyphCount; ++i ) { - hb_glyph_info_t curGlyph = glyphInfo[i]; - auto curChar = string[run.pos() + curGlyph.cluster]; - lWidth = width; + for ( size_t i = 0; i < sgs; i++ ) { + const ShapedGlyph& sg = layout.shapedGlyphs[i]; - if ( curChar == '\t' ) { - width += tabAdvance( hspace, tabWidth, - tabOffset ? *tabOffset + width : tabOffset ); + Glyph metrics = + sg.font->getGlyphByIndex( sg.glyphIndex, fontSize, bold, italic, outlineThickness ); + + // Define the boundaries of the character's clickable cell + Float charLeft = sg.position.x; + Float charTop = sg.position.y; + Float charBottom = charTop + vspace; + Float charRight; + + bool isLastOnLine = + ( i + 1 == sgs || layout.shapedGlyphs[i + 1].position.y != sg.position.y ); + + if ( !isLastOnLine ) { + // The cell extends to the beginning of the next glyph + charRight = layout.shapedGlyphs[i + 1].position.x; + } else { + // For the last glyph on a line, the cell is its advance width + charRight = charLeft + metrics.advance; + } + + // In complex scripts, visual order might not guarantee x increases (e.g. negative + // kerning). Ensure right > left for hit-testing, otherwise the cell has no width or + // negative width. + if ( charRight <= charLeft ) + charRight = charLeft + metrics.advance; + + // --- Direct Hit Test --- + // Check if the point is within the vertical bounds of the current line + if ( fpos.y >= charTop && fpos.y <= charBottom ) { + auto findNextInsertionIndex = [&]() -> Int32 { + // Return insertion point after this glyph. Find the next distinct stringIndex. + for ( size_t j = i + 1; j < sgs; ++j ) { + if ( layout.shapedGlyphs[j].stringIndex > sg.stringIndex ) + return layout.shapedGlyphs[j].stringIndex; + } + return tSize; // Reached the end + }; + + // Case 1: Point is within the horizontal bounds of this glyph's cell + if ( fpos.x >= charLeft && fpos.x < charRight ) { + Float midPoint = charLeft + ( charRight - charLeft ) * 0.5f; + if ( fpos.x < midPoint ) { + return sg.stringIndex; } else { - Glyph glyph = - font->getGlyphByIndex( curGlyph.codepoint, fontSize, bold, italic, - outlineThickness, rFont->getPage( fontSize ) ); - - width += rFont->getKerningFromGlyphIndex( prevGlyphIndex, - curGlyph.codepoint, fontSize, - bold, italic, outlineThickness ); - - width += font->isColorEmojiFont() && ' ' != curChar ? glyph.size.getWidth() - : glyph.advance; - } - - if ( pos.x <= width && pos.x >= lWidth && pos.y <= height && - pos.y >= lHeight ) { - if ( run.pos() + curGlyph.cluster + 1 <= tSize ) { - Int32 tcurDist = eeabs( pos.x - lWidth ); - Int32 nextDist = eeabs( pos.x - width ); - if ( nextDist < tcurDist ) { - nearest = run.pos() + curGlyph.cluster + 1; - return false; - } - } - nearest = run.pos() + curGlyph.cluster; - return false; - } - - if ( returnNearest ) { - curDist = eeabs( - fpos.distance( Vector2f( width - ( width - lWidth ) * 0.5f, - height - ( height - lHeight ) * 0.5f ) ) ); - if ( curDist < minDist ) { - nearest = run.pos() + curGlyph.cluster; - minDist = curDist; - } - } - - prevGlyphIndex = curGlyph.codepoint; - } - - if ( run.runIsNewLine() ) { - lWidth = 0; - width = 0; - lHeight = height; - height += vspace; - if ( pos.x > width && pos.y <= lHeight && glyphCount > 0 ) { - nearest = run.pos() + glyphInfo[glyphCount - 1].cluster + 1; - return false; + return findNextInsertionIndex(); } } + // Case 2: Point is to the right of the last glyph on the line + else if ( isLastOnLine && fpos.x >= charRight ) { + return findNextInsertionIndex(); + } + } - return true; - } ); - - if ( completeRun && pos.x >= width ) - return tSize; + // --- Nearest Character Test --- + if ( returnNearest ) { + Vector2f cellCenter( ( charLeft + charRight ) * 0.5f, charTop + vspace * 0.5f ); + Int32 dist = static_cast( fpos.distance( cellCenter ) ); + if ( dist < minDist ) { + minDist = dist; + nearest = sg.stringIndex; // Store the index of the character itself + } + } + } return nearest; } #endif @@ -1720,52 +1680,11 @@ void Text::updateWidthCache() { #ifdef EE_TEXT_SHAPER_ENABLED if ( TextShaperEnabled && mFontStyleConfig.Font->getType() == FontType::TTF ) { - FontTrueType* rFont = static_cast( mFontStyleConfig.Font ); - shapeAndRun( mString, mFontStyleConfig, - [&]( hb_glyph_info_t* glyphInfo, hb_glyph_position_t*, Uint32 glyphCount, - const hb_segment_properties_t&, TextShapeRun& run ) { - FontTrueType* font = run.font(); - Uint32 prevGlyphIndex = 0; - - for ( std::size_t i = 0; i < glyphCount; ++i ) { - hb_glyph_info_t curGlyph = glyphInfo[i]; - auto curChar = mString[run.pos() + curGlyph.cluster]; - - if ( curChar == '\t' ) { - width += tabAdvance( hspace, mTabWidth, - mTabStops ? width : std::optional{} ); - } else { - Glyph glyph = font->getGlyphByIndex( - curGlyph.codepoint, mFontStyleConfig.CharacterSize, bold, - italic, mFontStyleConfig.OutlineThickness, - rFont->getPage( mFontStyleConfig.CharacterSize ) ); - - width += rFont->getKerningFromGlyphIndex( - prevGlyphIndex, curGlyph.codepoint, - mFontStyleConfig.CharacterSize, bold, italic, - mFontStyleConfig.OutlineThickness ); - - width += font->isColorEmojiFont() && ' ' != curChar - ? glyph.size.getWidth() - : glyph.advance; - } - - maxWidth = eemax( maxWidth, width ); - prevGlyphIndex = curGlyph.codepoint; - } - - if ( run.runIsNewLine() ) { - mLinesWidth.push_back( width ); - width = 0; - } - - return true; - } ); - - if ( !mString.empty() && mString[mString.size() - 1] != '\n' ) - mLinesWidth.push_back( width ); - - mCachedWidth = maxWidth; + auto layout = TextLayouter::layout( mString, mFontStyleConfig.Font, + mFontStyleConfig.CharacterSize, mFontStyleConfig.Style, + mTabWidth, mFontStyleConfig.OutlineThickness ); + mLinesWidth = std::move( layout.linesWidth ); + mCachedWidth = layout.size.getWidth(); return; } #endif @@ -1778,23 +1697,29 @@ void Text::updateWidthCache() { auto glyph = mFontStyleConfig.Font->getGlyph( codepoint, mFontStyleConfig.CharacterSize, bold, italic, mFontStyleConfig.OutlineThickness ); - if ( codepoint != '\r' && codepoint != '\t' ) { - width += mFontStyleConfig.Font->getKerning( prevChar, codepoint, - mFontStyleConfig.CharacterSize, bold, - italic, mFontStyleConfig.OutlineThickness ); + + if ( codepoint != '\t' && codepoint != '\n' ) { + auto kerning = mFontStyleConfig.Font->getKerning( + prevChar, codepoint, mFontStyleConfig.CharacterSize, bold, italic, + mFontStyleConfig.OutlineThickness ); + width += kerning; + width += glyph.advance; } else if ( codepoint == '\t' ) { width += tabAdvance( hspace, mTabWidth, mTabStops ? width : std::optional{} ); + } else if ( codepoint == '\r' ) { + prevChar = 0; + continue; } if ( codepoint == '\n' ) { - mLinesWidth.push_back( width - glyph.advance ); + mLinesWidth.push_back( width ); width = 0; + prevChar = 0; + } else { + maxWidth = eemax( maxWidth, width ); + prevChar = codepoint; } - - if ( width > maxWidth ) - maxWidth = width; - prevChar = codepoint; } if ( !mString.empty() && mString[mString.size() - 1] != '\n' ) @@ -2068,162 +1993,146 @@ void Text::ensureGeometryUpdate() { Float centerDiffX = 0; unsigned int line = 0; - switch ( Font::getHorizontalAlign( mAlign ) ) { - case TEXT_ALIGN_CENTER: - centerDiffX = line < mLinesWidth.size() - ? (Float)( (Int32)( ( mCachedWidth - mLinesWidth[line] ) * 0.5f ) ) - : 0.f; - line++; - break; - case TEXT_ALIGN_RIGHT: - centerDiffX = line < mLinesWidth.size() ? mCachedWidth - mLinesWidth[line] : 0.f; - line++; - break; - } - #ifdef EE_TEXT_SHAPER_ENABLED if ( TextShaperEnabled && mFontStyleConfig.Font->getType() == FontType::TTF ) { FontTrueType* rFont = static_cast( mFontStyleConfig.Font ); + auto layout = TextLayouter::layout( mString, rFont, mFontStyleConfig.CharacterSize, + mFontStyleConfig.Style, mTabWidth, + mFontStyleConfig.OutlineThickness ); - shapeAndRun( - mString, mFontStyleConfig, - [&]( hb_glyph_info_t* glyphInfo, hb_glyph_position_t* glyphPos, Uint32 glyphCount, - const hb_segment_properties_t&, TextShapeRun& run ) { - FontTrueType* font = run.font(); - Uint32 prevGlyphIndex = 0; + mLinesWidth = std::move( layout.linesWidth ); + mCachedWidth = layout.size.getWidth(); - for ( std::size_t i = 0; i < glyphCount; ++i ) { - hb_glyph_info_t curGlyph = glyphInfo[i]; - hb_glyph_position_t curGlyphPos = glyphPos[i]; - auto curChar = mString[run.pos() + curGlyph.cluster]; + for ( const ShapedGlyph& sg : layout.shapedGlyphs ) { + Float currentX = x + sg.position.x; + Float currentY = y + sg.position.y; - x += rFont->getKerningFromGlyphIndex( - prevGlyphIndex, curGlyph.codepoint, mFontStyleConfig.CharacterSize, bold, - reqItalic, mFontStyleConfig.OutlineThickness ); + line = std::floor( sg.position.y / vspace ); - if ( curChar == '\t' ) { - minX = std::min( minX, x ); + switch ( Font::getHorizontalAlign( mAlign ) ) { + case TEXT_ALIGN_CENTER: + centerDiffX = line < mLinesWidth.size() + ? std::trunc( ( mCachedWidth - mLinesWidth[line] ) * 0.5f ) + : 0.f; + break; + case TEXT_ALIGN_RIGHT: + centerDiffX = + line < mLinesWidth.size() ? mCachedWidth - mLinesWidth[line] : 0.f; + break; + } - x += - tabAdvance( hspace, mTabWidth, mTabStops ? x : std::optional{} ); + // Apply the outline + if ( mFontStyleConfig.OutlineThickness != 0 ) { + Glyph glyph = + sg.font->getGlyphByIndex( sg.glyphIndex, mFontStyleConfig.CharacterSize, bold, + reqItalic, mFontStyleConfig.OutlineThickness, + rFont->getPage( mFontStyleConfig.CharacterSize ) ); - maxX = std::max( maxX, x ); + Float left = glyph.bounds.Left; + Float top = glyph.bounds.Top; + Float right = glyph.bounds.Left + glyph.bounds.Right; + Float bottom = glyph.bounds.Top + glyph.bounds.Bottom; - if ( mCachedWidthNeedUpdate ) - maxW = std::max( maxW, x ); - - prevGlyphIndex = curGlyph.codepoint; - continue; - } - - Float currentX = x + ( curGlyphPos.x_offset / 64.f ); - Float currentY = y + ( curGlyphPos.y_offset / 64.f ); - - // Apply the outline - if ( mFontStyleConfig.OutlineThickness != 0 ) { - Glyph glyph = font->getGlyphByIndex( - curGlyph.codepoint, mFontStyleConfig.CharacterSize, bold, reqItalic, - mFontStyleConfig.OutlineThickness, - rFont->getPage( mFontStyleConfig.CharacterSize ) ); - - Float left = glyph.bounds.Left; - Float top = glyph.bounds.Top; - Float right = glyph.bounds.Left + glyph.bounds.Right; - Float bottom = glyph.bounds.Top + glyph.bounds.Bottom; - - // Add the outline glyph to the vertices - if ( glyph.bounds.Right > 0 && glyph.bounds.Bottom > 0 ) { - addGlyphQuad( mOutlineVertices, Vector2f( currentX, currentY ), glyph, - italic, mFontStyleConfig.OutlineThickness, centerDiffX ); - } - - // Update the current bounds with the outlined glyph bounds - minX = std::min( minX, x + left - italic * bottom - - mFontStyleConfig.OutlineThickness ); - maxX = std::max( maxX, x + right - italic * top - - mFontStyleConfig.OutlineThickness ); - minY = std::min( minY, y + top - mFontStyleConfig.OutlineThickness ); - maxY = std::max( maxY, y + bottom - mFontStyleConfig.OutlineThickness ); - if ( mCachedWidthNeedUpdate ) { - maxW = std::max( maxW, x + glyph.advance - italic * top - - mFontStyleConfig.OutlineThickness ); - } - } - - // Extract the current glyph's description - Glyph glyph = font->getGlyphByIndex( - curGlyph.codepoint, mFontStyleConfig.CharacterSize, bold, reqItalic, 0, - rFont->getPage( mFontStyleConfig.CharacterSize ) ); - - Float left = glyph.bounds.Left; - Float top = glyph.bounds.Top; - Float right = glyph.bounds.Left + glyph.bounds.Right; - Float bottom = glyph.bounds.Top + glyph.bounds.Bottom; - - // Add a quad for the current character - if ( glyph.bounds.Right > 0 && glyph.bounds.Bottom > 0 ) { - addGlyphQuad( mVertices, Vector2f( currentX, currentY ), glyph, italic, 0, - centerDiffX ); - } - - // Update the current bounds - minX = std::min( minX, currentX + left - italic * bottom ); - maxX = std::max( maxX, currentX + right - italic * top ); - minY = std::min( minY, currentY + top ); - maxY = std::max( maxY, currentY + bottom ); - - // Advance to the next character - x += font->isColorEmojiFont() && ' ' != curChar ? glyph.size.getWidth() - : glyph.advance; - - prevGlyphIndex = curGlyph.codepoint; + // Add the outline glyph to the vertices + if ( glyph.bounds.Right > 0 && glyph.bounds.Bottom > 0 ) { + addGlyphQuad( mOutlineVertices, Vector2f( currentX, currentY ), glyph, italic, + mFontStyleConfig.OutlineThickness, centerDiffX ); } - // If we're using the underlined style, add the last line - if ( underlined && run.runIsNewLine() ) { - addLine( mVertices, x, y, underlineOffset, underlineThickness, 0, centerDiffX ); + // Update the current bounds with the outlined glyph bounds + minX = std::min( minX, currentX + left - italic * bottom - + mFontStyleConfig.OutlineThickness ); + maxX = std::max( maxX, currentX + right - italic * top - + mFontStyleConfig.OutlineThickness ); + minY = std::min( minY, currentY + top - mFontStyleConfig.OutlineThickness ); + maxY = std::max( maxY, currentY + bottom - mFontStyleConfig.OutlineThickness ); + maxW = std::max( maxW, currentX + glyph.advance - italic * top - + mFontStyleConfig.OutlineThickness ); + } - if ( mFontStyleConfig.OutlineThickness != 0 ) - addLine( mOutlineVertices, x, y, underlineOffset, underlineThickness, - mFontStyleConfig.OutlineThickness, centerDiffX ); + // Extract the current glyph's description + Glyph glyph = sg.font->getGlyphByIndex( + sg.glyphIndex, mFontStyleConfig.CharacterSize, bold, reqItalic, 0, + rFont->getPage( mFontStyleConfig.CharacterSize ) ); + + Float left = glyph.bounds.Left; + Float top = glyph.bounds.Top; + Float right = glyph.bounds.Left + glyph.bounds.Right; + Float bottom = glyph.bounds.Top + glyph.bounds.Bottom; + + // Add a quad for the current character + if ( glyph.bounds.Right > 0 && glyph.bounds.Bottom > 0 ) { + addGlyphQuad( mVertices, Vector2f( currentX, currentY ), glyph, italic, 0, + centerDiffX ); + } + + // Update the current bounds + minX = std::min( minX, currentX + left - italic * bottom ); + maxX = std::max( maxX, currentX + right - italic * top ); + minY = std::min( minY, currentY + top ); + maxY = std::max( maxY, currentY + bottom ); + maxW = std::max( maxW, currentX + glyph.advance - italic * top ); + } + + // If we're using the underlined style, add the last line + if ( underlined ) { + Float lineTop = y; + + for ( size_t lineIdx = 0; lineIdx < mLinesWidth.size(); lineIdx++ ) { + switch ( Font::getHorizontalAlign( mAlign ) ) { + case TEXT_ALIGN_CENTER: + centerDiffX = + lineIdx < mLinesWidth.size() + ? std::trunc( ( mCachedWidth - mLinesWidth[lineIdx] ) * 0.5f ) + : 0.f; + break; + case TEXT_ALIGN_RIGHT: + centerDiffX = lineIdx < mLinesWidth.size() + ? mCachedWidth - mLinesWidth[lineIdx] + : 0.f; + break; } - // If we're using the strike through style, add the last line across all characters - if ( strikeThrough && run.runIsNewLine() ) { - addLine( mVertices, x, y, strikeThroughOffset, underlineThickness, 0, - centerDiffX ); + addLine( mVertices, mLinesWidth[lineIdx], lineTop, underlineOffset, + underlineThickness, 0, centerDiffX ); - if ( mFontStyleConfig.OutlineThickness != 0 ) - addLine( mOutlineVertices, x, y, strikeThroughOffset, underlineThickness, - mFontStyleConfig.OutlineThickness, centerDiffX ); + if ( mFontStyleConfig.OutlineThickness != 0 ) + addLine( mOutlineVertices, mLinesWidth[lineIdx], lineTop, underlineOffset, + underlineThickness, mFontStyleConfig.OutlineThickness, centerDiffX ); + + lineTop += vspace; + } + } + + // If we're using the strike through style, add the last line across all characters + if ( strikeThrough ) { + Float lineTop = y; + + for ( size_t lineIdx = 0; lineIdx < mLinesWidth.size(); lineIdx++ ) { + switch ( Font::getHorizontalAlign( mAlign ) ) { + case TEXT_ALIGN_CENTER: + centerDiffX = + lineIdx < mLinesWidth.size() + ? std::trunc( ( mCachedWidth - mLinesWidth[lineIdx] ) * 0.5f ) + : 0.f; + break; + case TEXT_ALIGN_RIGHT: + centerDiffX = lineIdx < mLinesWidth.size() + ? mCachedWidth - mLinesWidth[lineIdx] + : 0.f; + break; } - if ( mCachedWidthNeedUpdate ) - mLinesWidth.push_back( x ); + addLine( mVertices, mLinesWidth[lineIdx], lineTop, strikeThroughOffset, + underlineThickness, 0, centerDiffX ); - // next line - if ( run.runIsNewLine() ) { - y += vspace; - x = 0; - switch ( Font::getHorizontalAlign( mAlign ) ) { - case TEXT_ALIGN_CENTER: - centerDiffX = - line < mLinesWidth.size() - ? (Float)( (Int32)( ( mCachedWidth - mLinesWidth[line] ) * - 0.5f ) ) - : 0.f; - line++; - break; - case TEXT_ALIGN_RIGHT: - centerDiffX = - line < mLinesWidth.size() ? mCachedWidth - mLinesWidth[line] : 0.f; - line++; - break; - } - } + if ( mFontStyleConfig.OutlineThickness != 0 ) + addLine( mOutlineVertices, mLinesWidth[lineIdx], lineTop, strikeThroughOffset, + underlineThickness, mFontStyleConfig.OutlineThickness, centerDiffX ); - return true; - } ); + lineTop += vspace; + } + } // Update the bounding rectangle mBounds.Left = minX; @@ -2240,14 +2149,30 @@ void Text::ensureGeometryUpdate() { } #endif + switch ( Font::getHorizontalAlign( mAlign ) ) { + case TEXT_ALIGN_CENTER: + centerDiffX = line < mLinesWidth.size() + ? (Float)( (Int32)( ( mCachedWidth - mLinesWidth[line] ) * 0.5f ) ) + : 0.f; + line++; + break; + case TEXT_ALIGN_RIGHT: + centerDiffX = line < mLinesWidth.size() ? mCachedWidth - mLinesWidth[line] : 0.f; + line++; + break; + } + for ( std::size_t i = 0; i < size; ++i ) { Uint32 curChar = mString[i]; // Apply the kerning offset - x += - mFontStyleConfig.Font->getKerning( prevChar, curChar, mFontStyleConfig.CharacterSize, - bold, reqItalic, mFontStyleConfig.OutlineThickness ); - prevChar = curChar; + if ( curChar != '\n' && curChar != '\r' ) { + x += mFontStyleConfig.Font->getKerning( prevChar, curChar, + mFontStyleConfig.CharacterSize, bold, reqItalic, + mFontStyleConfig.OutlineThickness ); + prevChar = curChar; + } else + prevChar = 0; // If we're using the underlined style and there's a new line, draw a line if ( underlined && ( curChar == L'\n' ) ) { diff --git a/src/tests/unit_tests/fontrendering.cpp b/src/tests/unit_tests/fontrendering.cpp index 315059985..a6e3e815e 100644 --- a/src/tests/unit_tests/fontrendering.cpp +++ b/src/tests/unit_tests/fontrendering.cpp @@ -1,7 +1,7 @@ -#include "eepp/ui/uithememanager.hpp" #include "utest.hpp" #include +#include #include #include #include @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -52,7 +53,10 @@ static void compareImages( utest_state_s& utest_state, int* utest_result, EE::Wi EXPECT_TRUE( result.areSame() ); if ( !result.areSame() ) { auto saveExt( Image::saveTypeToExtension( saveType ) ); - std::string withTextShaper = Text::TextShaperEnabled ? "_text_shape" : ""; + std::string withTextShaper = + Text::TextShaperEnabled + ? ( Text::TextShaperOptimizations ? "_text_shape_no_opt" : "_text_shape" ) + : ""; std::cerr << "Test FAILED: " << result.numDifferentPixels << " pixels differ." << std::endl; std::cerr << "Maximum perceptual difference (Delta E): " << result.maxDeltaE << std::endl; if ( !FileSystem::fileExists( "output" ) ) @@ -183,6 +187,10 @@ UTEST( FontRendering, fontsTest ) { { BoolScopedOp op( Text::TextShaperEnabled, true ); runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled w/o optimizations" ); + BoolScopedOp op2( Text::TextShaperOptimizations, false ); + runTest(); } } @@ -211,6 +219,10 @@ UTEST( FontRendering, editorTest ) { { BoolScopedOp op( Text::TextShaperEnabled, true ); runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled w/o optimizations" ); + BoolScopedOp op2( Text::TextShaperOptimizations, false ); + runTest(); } } @@ -236,6 +248,10 @@ UTEST( FontRendering, textEditTest ) { { BoolScopedOp op( Text::TextShaperEnabled, true ); runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled w/o optimizations" ); + BoolScopedOp op2( Text::TextShaperOptimizations, false ); + runTest(); } } @@ -262,6 +278,10 @@ UTEST( FontRendering, tabsTest ) { { BoolScopedOp op( Text::TextShaperEnabled, true ); runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled w/o optimizations" ); + BoolScopedOp op2( Text::TextShaperOptimizations, false ); + runTest(); } } @@ -289,6 +309,10 @@ UTEST( FontRendering, tabStopTest ) { { BoolScopedOp op( Text::TextShaperEnabled, true ); runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled w/o optimizations" ); + BoolScopedOp op2( Text::TextShaperOptimizations, false ); + runTest(); } } @@ -314,6 +338,10 @@ UTEST( FontRendering, tabsTextEditTest ) { { BoolScopedOp op( Text::TextShaperEnabled, true ); runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled w/o optimizations" ); + BoolScopedOp op2( Text::TextShaperOptimizations, false ); + runTest(); } } @@ -340,6 +368,10 @@ UTEST( FontRendering, tabStopTextEditTest ) { { BoolScopedOp op( Text::TextShaperEnabled, true ); runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled w/o optimizations" ); + BoolScopedOp op2( Text::TextShaperOptimizations, false ); + runTest(); } } @@ -367,6 +399,10 @@ UTEST( FontRendering, textViewTest ) { { BoolScopedOp op( Text::TextShaperEnabled, true ); runTest(); + + UTEST_PRINT_STEP( "Text Shaper enabled w/o optimizations" ); + BoolScopedOp op2( Text::TextShaperOptimizations, false ); + runTest(); } } @@ -377,8 +413,8 @@ UTEST( FontRendering, textEditBengaliTest ) { WindowBackend::Default, 32, {}, 1, false, true ), UIApplication::Settings( Sys::getProcessPath() + ".." + FileSystem::getOSSlash(), 1.5f ) ); FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); - FontTrueType* bengaliFont = FontTrueType::New( "NotoSansBengali-Regular", - "assets/fonts/NotoSansBengali-Regular.ttf" ); + FontTrueType* bengaliFont = + FontTrueType::New( "NotoSansBengali-Regular", "assets/fonts/NotoSansBengali-Regular.ttf" ); FontManager::instance()->addFallbackFont( bengaliFont ); UTEST_PRINT_STEP( "Text Shaper enabled" ); auto* editor = UITextEdit::New(); @@ -396,6 +432,8 @@ UTEST( FontRendering, textSizes ) { ASSERT_TRUE_MSG( win->isOpen(), "Failed to create Window" ); + Text::TextShaperEnabled = false; + FontTrueType* font = FontTrueType::New( "NotoSans-Regular" ); font->loadFromFile( "../assets/fonts/NotoSans-Regular.ttf" ); @@ -417,6 +455,12 @@ UTEST( FontRendering, textSizes ) { EXPECT_EQ( 96, size.getHeight() ); EXPECT_EQ( 445, Text::getTextWidth( txt, config ) ); + Vector2i topPos{ 120, 0 }; + EXPECT_EQ( 19, Text::findCharacterFromPos( topPos, true, config.Font, config.CharacterSize, + txt, 0 ) ); + EXPECT_EQ( 19, Text::findCharacterFromPos( topPos, false, config.Font, config.CharacterSize, + txt, 0 ) ); + Vector2i startPos{ 120, 7 }; EXPECT_EQ( 19, Text::findCharacterFromPos( startPos, true, config.Font, config.CharacterSize, txt, 0 ) ); @@ -427,7 +471,7 @@ UTEST( FontRendering, textSizes ) { EXPECT_EQ( 242, Text::findCharacterFromPos( middlePos, true, config.Font, config.CharacterSize, txt, 0 ) ); EXPECT_EQ( 242, Text::findCharacterFromPos( middlePos, false, config.Font, - config.CharacterSize, txt, 0 ) ); + config.CharacterSize, txt, 0 ) ); Vector2i endPos{ 120, 103 }; EXPECT_EQ( 395, Text::findCharacterFromPos( endPos, true, config.Font, config.CharacterSize, @@ -436,6 +480,8 @@ UTEST( FontRendering, textSizes ) { txt, 0 ) ); EXPECT_EQ( 18ul, Text::findLastCharPosWithinLength( txt, 120, config ) ); + EXPECT_EQ( 446ul, Text::findLastCharPosWithinLength( txt, 1000, config ) ); + Vector2f pos = Text::findCharacterPos( 19, config.Font, config.CharacterSize, txt, 0 ); EXPECT_EQ( 120, pos.x ); EXPECT_EQ( 0, pos.y ); @@ -467,5 +513,89 @@ UTEST( FontRendering, textSizes ) { runTest(); } + UTEST_PRINT_STEP( "Text Shaper enabled w/o optimizations" ); + { + BoolScopedOp op( Text::TextShaperEnabled, true ); + BoolScopedOp op2( Text::TextShaperOptimizations, false ); + runTest(); + } + + Engine::destroySingleton(); +} + +UTEST( FontRendering, textStyles ) { + auto win = Engine::instance()->createWindow( + WindowSettings( 1024, 230, "eepp - Text Styles", WindowStyle::Default, + WindowBackend::Default, 32, {}, 1, false, true ) ); + + ASSERT_TRUE_MSG( win->isOpen(), "Failed to create Window" ); + + Text::TextShaperEnabled = false; + + FontTrueType* font = FontTrueType::New( "NotoSans-Regular" ); + font->loadFromFile( "../assets/fonts/NotoSans-Regular.ttf" ); + FontFamily::loadFromRegular( font ); + + win->setClearColor( RGB( 255, 255, 255 ) ); + + FontStyleConfig config; + config.Font = font; + config.FontColor = Color::Black; + config.CharacterSize = 20; + config.OutlineColor = Color::Black; + config.ShadowColor = Color::lightgray; + + String txt( "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n" + "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n" + "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n" + "consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n" + "cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\n" + "proident, sunt in culpa qui officia deserunt mollit anim id est laborum." ); + + const auto runTest = [&]( std::string_view styleName, Uint32 textAlign ) { + win->clear(); + Text text; + text.setStyleConfig( config ); + text.setString( txt ); + text.setAlign( textAlign ); + text.draw( 32, 32 ); + compareImages( utest_state, utest_result, win, "eepp-text-style-" + styleName ); + }; + + const auto runTestSuite = [&]( Uint32 style, std::string_view styleName, + Uint32 textAlign = TEXT_ALIGN_LEFT ) { + config.Style = style; + + UTEST_PRINT_STEP( styleName.data() ); + UTEST_PRINT_STEP( " Text Shaper disabled" ); + runTest( styleName, textAlign ); + + UTEST_PRINT_STEP( " Text Shaper enabled" ); + BoolScopedOp op( Text::TextShaperEnabled, true ); + runTest( styleName, textAlign ); + + UTEST_PRINT_STEP( " Text Shaper enabled w/o optimizations" ); + BoolScopedOp op2( Text::TextShaperOptimizations, false ); + runTest( styleName, textAlign ); + }; + + runTestSuite( Text::Regular, "regular" ); + runTestSuite( Text::Bold, "bold" ); + runTestSuite( Text::Italic, "italic" ); + runTestSuite( Text::Underlined, "underline" ); + runTestSuite( Text::StrikeThrough, "strikethrough" ); + runTestSuite( Text::Shadow, "shadow" ); + config.FontColor = Color::White; + config.OutlineThickness = 1; + runTestSuite( Text::Regular, "outline" ); + config.FontColor = Color::Black; + config.OutlineThickness = 0; + runTestSuite( Text::Regular, "regular-center", TEXT_ALIGN_CENTER ); + runTestSuite( Text::Regular, "regular-right", TEXT_ALIGN_RIGHT ); + runTestSuite( Text::Underlined, "underline-center", TEXT_ALIGN_CENTER ); + runTestSuite( Text::Underlined, "underline-right", TEXT_ALIGN_RIGHT ); + runTestSuite( Text::StrikeThrough, "strikethrough-center", TEXT_ALIGN_CENTER ); + runTestSuite( Text::StrikeThrough, "strikethrough-right", TEXT_ALIGN_RIGHT ); + Engine::destroySingleton(); } From 491b15d6ca065b428a88f3ba00f01dd518204b90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sun, 2 Nov 2025 17:58:05 -0300 Subject: [PATCH 8/8] Some extra improvements and adjustments. --- .../assets/textfiles/test-arabic.uext | 48 ++++++++-------- .../assets/textfiles/test-bengali.uext | 48 ++++++++-------- .../tabs_test.txt => textfiles/test-tabs.txt} | 0 include/eepp/math/rect.hpp | 7 +++ include/eepp/ui/uicodeeditor.hpp | 14 +++-- src/eepp/ui/uicodeeditor.cpp | 57 +++++++++++-------- src/tests/unit_tests/fontrendering.cpp | 8 +-- 7 files changed, 101 insertions(+), 81 deletions(-) rename bin/unit_tests/assets/{fontrendering/tabs_test.txt => textfiles/test-tabs.txt} (100%) diff --git a/bin/unit_tests/assets/textfiles/test-arabic.uext b/bin/unit_tests/assets/textfiles/test-arabic.uext index ba4616f46..f148e5c67 100644 --- a/bin/unit_tests/assets/textfiles/test-arabic.uext +++ b/bin/unit_tests/assets/textfiles/test-arabic.uext @@ -1,24 +1,24 @@ -Hello: مرحبا -Good morning: صباح الخير -Good night: تصبح على خير -Thank you: شكراً -You're welcome: عفواً -Yes / No: نعم / لا -Please: من فضلك -Excuse me / Sorry: عفواً / آسف -How are you?: كيف حالك؟ -I'm fine. And you?: أنا بخير. وأنت؟ -What's your name?: ما اسمك؟ -My name is...: اسمي... -Nice to meet you: تشرفت بلقائك -Where are you from?: من أين أنت؟ -I'm from...: أنا من... -Do you speak English?: هل تتحدث الإنجليزية؟ -I don't understand: لا أفهم -Please speak more slowly: من فضلك تكلم ببطء أكثر -Please write it down: من فضلك اكتبه -How much is this?: كم سعره؟ -Where is the bathroom?: أين الحمام؟ -Help!: المساعدة! -Stop!: توقف! -Call the police!: اتصل بالشرطة! +Hello: مرحبا +Good morning: صباح الخير +Good night: تصبح على خير +Thank you: شكراً +You're welcome: عفواً +Yes / No: نعم / لا +Please: من فضلك +Excuse me / Sorry: عفواً / آسف +How are you?: كيف حالك؟ +I'm fine. And you?: أنا بخير. وأنت؟ +What's your name?: ما اسمك؟ +My name is...: اسمي... +Nice to meet you: تشرفت بلقائك +Where are you from?: من أين أنت؟ +I'm from...: أنا من... +Do you speak English?: هل تتحدث الإنجليزية؟ +I don't understand: لا أفهم +Please speak more slowly: من فضلك تكلم ببطء أكثر +Please write it down: من فضلك اكتبه +How much is this?: كم سعره؟ +Where is the bathroom?: أين الحمام؟ +Help!: المساعدة! +Stop!: توقف! +Call the police!: اتصل بالشرطة! diff --git a/bin/unit_tests/assets/textfiles/test-bengali.uext b/bin/unit_tests/assets/textfiles/test-bengali.uext index 5f6394e9c..aa6f39ae3 100644 --- a/bin/unit_tests/assets/textfiles/test-bengali.uext +++ b/bin/unit_tests/assets/textfiles/test-bengali.uext @@ -1,24 +1,24 @@ -Hello: হ্যালো / নমস্কার -Good morning: সুপ্রভাত -Good night: শুভ রাত্রি -Thank you: ধন্যবাদ -You're welcome: আপনি স্বাগত জানাই -Yes / No: হ্যাঁ / না -Please: অনুগ্রহ করে -Excuse me / Sorry: মাফ করবেন / দুঃখিত -How are you?: আপনি কেমন আছেন? -I'm fine. And you?: আমি ভালো আছি। এবং আপনি? -What's your name?: আপনার নাম কি? -My name is...: আমার নাম... -Nice to meet you: আপনার সাথে দেখা করে খুশি -Where are you from?: আপনি কোথা থেকে এসেছেন? -I'm from...: আমি ... থেকে এসেছি। -Do you speak English?: আপনি কি ইংরেজি বলতে পারেন? -I don't understand: আমি বুঝতে পারছি না। -Please speak more slowly: অনুগ্রহ করে ধীরে বলুন। -Please write it down: অনুগ্রহ করে এটি লিখে দিন। -How much is this?: এটার দাম কত? -Where is the bathroom?: বাথরুম কোথায়? -Help!: বাঁচাও! -Stop!: থামুন! -Call the police!: পুলিশ ডাকুন! +Hello: হ্যালো / নমস্কার +Good morning: সুপ্রভাত +Good night: শুভ রাত্রি +Thank you: ধন্যবাদ +You're welcome: আপনি স্বাগত জানাই +Yes / No: হ্যাঁ / না +Please: অনুগ্রহ করে +Excuse me / Sorry: মাফ করবেন / দুঃখিত +How are you?: আপনি কেমন আছেন? +I'm fine. And you?: আমি ভালো আছি। এবং আপনি? +What's your name?: আপনার নাম কি? +My name is...: আমার নাম... +Nice to meet you: আপনার সাথে দেখা করে খুশি +Where are you from?: আপনি কোথা থেকে এসেছেন? +I'm from...: আমি ... থেকে এসেছি। +Do you speak English?: আপনি কি ইংরেজি বলতে পারেন? +I don't understand: আমি বুঝতে পারছি না। +Please speak more slowly: অনুগ্রহ করে ধীরে বলুন। +Please write it down: অনুগ্রহ করে এটি লিখে দিন। +How much is this?: এটার দাম কত? +Where is the bathroom?: বাথরুম কোথায়? +Help!: বাঁচাও! +Stop!: থামুন! +Call the police!: পুলিশ ডাকুন! diff --git a/bin/unit_tests/assets/fontrendering/tabs_test.txt b/bin/unit_tests/assets/textfiles/test-tabs.txt similarity index 100% rename from bin/unit_tests/assets/fontrendering/tabs_test.txt rename to bin/unit_tests/assets/textfiles/test-tabs.txt diff --git a/include/eepp/math/rect.hpp b/include/eepp/math/rect.hpp index ab212942a..ee63d2716 100644 --- a/include/eepp/math/rect.hpp +++ b/include/eepp/math/rect.hpp @@ -79,6 +79,8 @@ template class tRECT { T getHeight() const; + void normalize(); + tRECT ceil() const; tRECT floor() const; @@ -265,6 +267,11 @@ template tSize tRECT::getSize() const { return tSize( eeabs( Right - Left ), eeabs( Bottom - Top ) ); } +template void tRECT::normalize() { + if ( Left > Right ) std::swap( Left, Right ); + if ( Top > Bottom ) std::swap( Top, Bottom ); +} + template T tRECT::getWidth() const { return eeabs( Right - Left ); } diff --git a/include/eepp/ui/uicodeeditor.hpp b/include/eepp/ui/uicodeeditor.hpp index bae125d51..d5f69f031 100644 --- a/include/eepp/ui/uicodeeditor.hpp +++ b/include/eepp/ui/uicodeeditor.hpp @@ -540,11 +540,13 @@ class EE_API UICodeEditor : public UIWidget, public TextDocument::Client { size_t characterWidth( const String& str ) const; - Float getTextWidth( const String& text, std::optional tabOffset = {} ) const; + Float getTextWidth( const String& text, std::optional tabOffset = {}, + Uint32 textHints = 0 ) const; size_t characterWidth( const String::View& str ) const; - Float getTextWidth( const String::View& text, std::optional tabOffset ) const; + Float getTextWidth( const String::View& text, std::optional tabOffset, + Uint32 textHints = 0 ) const; Float getLineHeight() const; @@ -1131,13 +1133,13 @@ class EE_API UICodeEditor : public UIWidget, public TextDocument::Client { template Float getTextWidth( const StringType& text, bool fromMonospaceLine, - std::optional tabOffset ) const; + std::optional tabOffset, Uint32 textHints = 0 ) const; - Float getTextWidth( const String& text, bool fromMonospaceLine, - std::optional tabOffset ) const; + Float getTextWidth( const String& text, bool fromMonospaceLine, std::optional tabOffset, + Uint32 textHints = 0 ) const; Float getTextWidth( const String::View& text, bool fromMonospaceLine, - std::optional tabOffset ) const; + std::optional tabOffset, Uint32 textHints = 0 ) const; void updateIMELocation(); diff --git a/src/eepp/ui/uicodeeditor.cpp b/src/eepp/ui/uicodeeditor.cpp index 21a32934e..69b9da3f6 100644 --- a/src/eepp/ui/uicodeeditor.cpp +++ b/src/eepp/ui/uicodeeditor.cpp @@ -2080,7 +2080,8 @@ Float UICodeEditor::getLineWidth( const Int64& docLine ) { auto len = i + 1 < vline.visualLines.size() ? vline.visualLines[i + 1].column() : line.size(); auto vlineStr = line.view().substr( pos, len - pos ); - auto curWidth = getTextWidth( vlineStr, isMonospaceLine ); + auto curWidth = + getTextWidth( vlineStr, isMonospaceLine, {}, mDoc->line( docLine ).getTextHints() ); width = eemax( width, curWidth ); } @@ -2096,13 +2097,15 @@ Float UICodeEditor::getLineWidth( const Int64& docLine ) { auto found = mLinesWidthCache.find( docLine ); if ( found != mLinesWidthCache.end() && line.getHash() == found->second.first ) return found->second.second; - Float width = getTextWidth( line.getText(), {}, mTabStops ? 0 : std::optional{} ); + Float width = getTextWidth( line.getText(), {}, mTabStops ? 0 : std::optional{}, + line.getTextHints() ); mLinesWidthCache[docLine] = { line.getHash(), width }; return width; } return getTextWidth( mDoc->line( docLine ).getText(), isMonospaceLine, - mTabStops ? 0 : std::optional{} ); + mTabStops ? 0 : std::optional{}, + mDoc->line( docLine ).getTextHints() ); } void UICodeEditor::updateScrollBar() { @@ -2530,12 +2533,12 @@ Vector2d UICodeEditor::getTextPositionOffset( const TextPosition& position, const auto& line = mDoc->line( position.line() ).getText(); auto partialLine = line.view().substr( info.range.start().column(), info.range.end().column() ); - Float x = - Text::findCharacterPos( position.column() - info.range.start().column(), mFont, - getCharacterSize(), partialLine, mFontStyleConfig.Style, - mTabWidth, mFontStyleConfig.OutlineThickness, - mTabStops ? 0 : std::optional(), false ) - .x; + Float x = Text::findCharacterPos( + position.column() - info.range.start().column(), mFont, + getCharacterSize(), partialLine, mFontStyleConfig.Style, mTabWidth, + mFontStyleConfig.OutlineThickness, mTabStops ? 0 : std::optional(), + false, mDoc->line( position.line() ).getTextHints() ) + .x; if ( visualizeNewLine && allowVisualLineEnd && position.column() == (Int64)mDoc->line( position.line() ).getText().size() - 1 ) x += getGlyphWidth(); @@ -2567,7 +2570,8 @@ Vector2d UICodeEditor::getTextPositionOffset( const TextPosition& position, Text::findCharacterPos( isLastChar ? position.column() - 1 : position.column(), mFont, getCharacterSize(), mDoc->line( position.line() ).getText(), mFontStyleConfig.Style, mTabWidth, - mFontStyleConfig.OutlineThickness, mTabStops ? 0 : std::optional(), false ) + mFontStyleConfig.OutlineThickness, mTabStops ? 0 : std::optional(), false, + mDoc->line( position.line() ).getTextHints() ) .x; if ( visualizeNewLine && isLastChar ) x += getGlyphWidth(); @@ -2600,34 +2604,36 @@ size_t UICodeEditor::characterWidth( const String& str ) const { return characterWidth( str ); } -Float UICodeEditor::getTextWidth( const String& text, std::optional tabOffset ) const { - return getTextWidth( text, false, tabOffset ); +Float UICodeEditor::getTextWidth( const String& text, std::optional tabOffset, + Uint32 textHints ) const { + return getTextWidth( text, false, tabOffset, textHints ); } size_t UICodeEditor::characterWidth( const String::View& str ) const { return characterWidth( str ); } -Float UICodeEditor::getTextWidth( const String::View& text, std::optional tabOffset ) const { - return getTextWidth( text, false, tabOffset ); +Float UICodeEditor::getTextWidth( const String::View& text, std::optional tabOffset, + Uint32 textHints ) const { + return getTextWidth( text, false, tabOffset, textHints ); } Float UICodeEditor::getTextWidth( const String& text, bool fromMonospaceLine, - std::optional tabOffset ) const { - return getTextWidth( text, fromMonospaceLine, tabOffset ); + std::optional tabOffset, Uint32 textHints ) const { + return getTextWidth( text, fromMonospaceLine, tabOffset, textHints ); } Float UICodeEditor::getTextWidth( const String::View& text, bool fromMonospaceLine, - std::optional tabOffset ) const { - return getTextWidth( text, fromMonospaceLine, tabOffset ); + std::optional tabOffset, Uint32 textHints ) const { + return getTextWidth( text, fromMonospaceLine, tabOffset, textHints ); } template Float UICodeEditor::getTextWidth( const StringType& line, bool fromMonospaceLine, - std::optional tabOffset ) const { + std::optional tabOffset, Uint32 textHints ) const { if ( !fromMonospaceLine && isNotMonospace() ) { return Text::getTextWidth( mFont, getCharacterSize(), line, mFontStyleConfig.Style, - mTabWidth, 0.f, 0, tabOffset ); + mTabWidth, 0.f, textHints, tabOffset ); } Float glyphWidth = getGlyphWidth(); @@ -3204,7 +3210,8 @@ Int64 UICodeEditor::getColFromXOffset( VisibleIndex visibleIndex, const Float& x Text::findCharacterFromPos( Vector2i( eemax( -xOffset + x, 0.f ), 0 ), true, mFont, getCharacterSize(), line, mFontStyleConfig.Style, mTabWidth, 0.f, - mTabStops ? 0 : std::optional() ); + mTabStops ? 0 : std::optional(), + mDoc->line( pos.line() ).getTextHints() ); } Int64 len = line.length(); @@ -3230,7 +3237,8 @@ Int64 UICodeEditor::getColFromXOffset( VisibleIndex visibleIndex, const Float& x if ( !isMonospaceLine( pos.line() ) ) { return Text::findCharacterFromPos( Vector2i( x, 0 ), true, mFont, getCharacterSize(), mDoc->line( pos.line() ).getText(), - mFontStyleConfig.Style, mTabWidth, 0.f, mTabStops ? 0 : std::optional() ); + mFontStyleConfig.Style, mTabWidth, 0.f, mTabStops ? 0 : std::optional(), + mDoc->line( pos.line() ).getTextHints() ); } const String& line = mDoc->line( pos.line() ).getText(); @@ -4193,6 +4201,7 @@ std::vector UICodeEditor::getTextRangeRectangles( } } selRect.Right = startScroll.x + endOffset.x; + selRect.normalize(); rects.push_back( selRect ); } } else { @@ -4232,6 +4241,7 @@ std::vector UICodeEditor::getTextRangeRectangles( lh, false, visualizeNewLines ) .x; } + selRect.normalize(); rects.push_back( selRect ); } } @@ -5365,7 +5375,8 @@ void UICodeEditor::setTabIndentAlignment( CharacterAlignment alignment ) { } bool UICodeEditor::isMonospaceLine( Int64 lineIndex ) const { - return mFont && ( mFont->isMonospace() || + return mFont && ( ( mFont->isMonospace() && + ( !Text::TextShaperEnabled || mDoc->line( lineIndex ).isAscii() ) ) || ( mFont->getType() == FontType::TTF && static_cast( mFont )->isIdentifiedAsMonospace() && mDoc->line( lineIndex ).isAscii() ) ); diff --git a/src/tests/unit_tests/fontrendering.cpp b/src/tests/unit_tests/fontrendering.cpp index a6e3e815e..eef6ca5c1 100644 --- a/src/tests/unit_tests/fontrendering.cpp +++ b/src/tests/unit_tests/fontrendering.cpp @@ -264,7 +264,7 @@ UTEST( FontRendering, tabsTest ) { FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); auto* editor = UICodeEditor::New(); editor->setPixelsSize( app.getUI()->getPixelsSize() ); - editor->loadFromFile( "assets/fontrendering/tabs_test.txt" ); + editor->loadFromFile( "assets/textfiles/test-tabs.txt" ); SceneManager::instance()->update(); SceneManager::instance()->draw(); compareImages( utest_state, utest_result, app.getWindow(), @@ -295,7 +295,7 @@ UTEST( FontRendering, tabStopTest ) { auto* editor = UICodeEditor::New(); editor->setTabStops( true ); editor->setPixelsSize( app.getUI()->getPixelsSize() ); - editor->loadFromFile( "assets/fontrendering/tabs_test.txt" ); + editor->loadFromFile( "assets/textfiles/test-tabs.txt" ); SceneManager::instance()->update(); SceneManager::instance()->draw(); compareImages( utest_state, utest_result, app.getWindow(), @@ -325,7 +325,7 @@ UTEST( FontRendering, tabsTextEditTest ) { FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); auto* editor = UITextEdit::New(); editor->setPixelsSize( app.getUI()->getPixelsSize() ); - editor->loadFromFile( "assets/fontrendering/tabs_test.txt" ); + editor->loadFromFile( "assets/textfiles/test-tabs.txt" ); SceneManager::instance()->update(); SceneManager::instance()->draw(); compareImages( utest_state, utest_result, app.getWindow(), "eepp-text-edit-tabs-test" ); @@ -355,7 +355,7 @@ UTEST( FontRendering, tabStopTextEditTest ) { auto* editor = UITextEdit::New(); editor->setTabStops( true ); editor->setPixelsSize( app.getUI()->getPixelsSize() ); - editor->loadFromFile( "assets/fontrendering/tabs_test.txt" ); + editor->loadFromFile( "assets/textfiles/test-tabs.txt" ); SceneManager::instance()->update(); SceneManager::instance()->draw(); compareImages( utest_state, utest_result, app.getWindow(), "eepp-text-edit-tab-stop-test" );