From 9b588454ec035214e69112ff4212460b2f8f7eaf Mon Sep 17 00:00:00 2001 From: Victor Cebollada Date: Tue, 31 Mar 2015 16:21:22 +0100 Subject: [PATCH] Use the line ascender and descender. Change-Id: I86c5b581faa1819a429dd31feb02044e405e855f Signed-off-by: Victor Cebollada --- .../internal/text/layouts/layout-engine.cpp | 52 +++++++++++++--------- dali-toolkit/internal/text/line-run.h | 4 +- dali-toolkit/internal/text/text-controller.cpp | 10 +++-- dali-toolkit/internal/text/text-io.cpp | 4 +- 4 files changed, 43 insertions(+), 27 deletions(-) diff --git a/dali-toolkit/internal/text/layouts/layout-engine.cpp b/dali-toolkit/internal/text/layouts/layout-engine.cpp index a88a877..1a97dd4 100644 --- a/dali-toolkit/internal/text/layouts/layout-engine.cpp +++ b/dali-toolkit/internal/text/layouts/layout-engine.cpp @@ -19,6 +19,7 @@ #include // EXTERNAL INCLUDES +#include #include #include @@ -35,6 +36,13 @@ namespace Toolkit namespace Text { +namespace +{ + +const float MAX_FLOAT = std::numeric_limits::max(); + +} //namespace + /** * @brief Stores temporary layout info of the line. */ @@ -48,7 +56,7 @@ struct LineLayout float widthAdvanceDiff; ///< The difference between the width and the advance of the last glyph. float wsLengthEndOfLine; ///< The length of the white spaces at the end of the line. float ascender; ///< The maximum ascender of all fonts in the line. - float descender; ///< The maximum descender of all fonts in the line. + float descender; ///< The minimum descender of all fonts in the line. }; struct LayoutEngine::Impl @@ -73,7 +81,7 @@ struct LayoutEngine::Impl lineLayout.length = 0.f; lineLayout.wsLengthEndOfLine = 0.f; lineLayout.ascender = 0.f; - lineLayout.descender = 0.f; + lineLayout.descender = MAX_FLOAT; // Get the last glyph index. const GlyphIndex lastGlyphIndex = parameters.totalNumberOfGlyphs - 1u; @@ -129,8 +137,8 @@ struct LayoutEngine::Impl lineLayout.ascender = fontMetrics.ascender; } - // Sets the maximum descender. - if( fontMetrics.descender > lineLayout.descender ) + // Sets the minimum descender. + if( fontMetrics.descender < lineLayout.descender ) { lineLayout.descender = fontMetrics.descender; } @@ -153,7 +161,7 @@ struct LayoutEngine::Impl lineLayout.widthAdvanceDiff = 0.f; lineLayout.wsLengthEndOfLine = 0.f; lineLayout.ascender = 0.f; - lineLayout.descender = 0.f; + lineLayout.descender = MAX_FLOAT; // Stores temporary line layout which has not been added to the final line layout. LineLayout tmpLineLayout; @@ -163,7 +171,7 @@ struct LayoutEngine::Impl tmpLineLayout.widthAdvanceDiff = 0.f; tmpLineLayout.wsLengthEndOfLine = 0.f; tmpLineLayout.ascender = 0.f; - tmpLineLayout.descender = 0.f; + tmpLineLayout.descender = MAX_FLOAT; FontId lastFontId = 0u; for( GlyphIndex glyphIndex = lineLayout.glyphIndex; @@ -244,7 +252,7 @@ struct LayoutEngine::Impl lineLayout.ascender = tmpLineLayout.ascender; } - if( tmpLineLayout.descender > lineLayout.descender ) + if( tmpLineLayout.descender < lineLayout.descender ) { lineLayout.descender = tmpLineLayout.descender; } @@ -255,7 +263,7 @@ struct LayoutEngine::Impl tmpLineLayout.widthAdvanceDiff = 0u; tmpLineLayout.wsLengthEndOfLine = 0u; tmpLineLayout.ascender = 0.f; - tmpLineLayout.descender = 0.f; + tmpLineLayout.descender = MAX_FLOAT; return; } @@ -284,7 +292,7 @@ struct LayoutEngine::Impl lineLayout.ascender = tmpLineLayout.ascender; } - if( tmpLineLayout.descender > lineLayout.descender ) + if( tmpLineLayout.descender < lineLayout.descender ) { lineLayout.descender = tmpLineLayout.descender; } @@ -295,7 +303,7 @@ struct LayoutEngine::Impl tmpLineLayout.widthAdvanceDiff = 0u; tmpLineLayout.wsLengthEndOfLine = 0u; tmpLineLayout.ascender = 0.f; - tmpLineLayout.descender = 0.f; + tmpLineLayout.descender = MAX_FLOAT; } if( lastFontId != glyphInfo.fontId ) @@ -309,10 +317,10 @@ struct LayoutEngine::Impl tmpLineLayout.ascender = fontMetrics.ascender; } - // Sets the maximum descender. - if( -fontMetrics.descender > tmpLineLayout.descender ) + // Sets the minimum descender. + if( -fontMetrics.descender < tmpLineLayout.descender ) { - tmpLineLayout.descender = -fontMetrics.descender; + tmpLineLayout.descender = fontMetrics.descender; } lastFontId = glyphInfo.fontId; @@ -437,7 +445,7 @@ struct LayoutEngine::Impl // 2) Calculate the alignment offset accordingly with the align option, // the box width, line length, and the paragraphs direction. float alignOffset = CalculateHorizontalAlignment( layoutSize.width, - line.lineSize.width, + line.width, line.extraLength, paragraphDirection ); @@ -472,8 +480,9 @@ struct LayoutEngine::Impl lineRun.numberOfGlyphs = layoutParameters.totalNumberOfGlyphs; lineRun.characterRun.characterIndex = 0u; lineRun.characterRun.numberOfCharacters = *( layoutParameters.glyphsToCharactersBuffer + lastGlyphIndex ) + *( layoutParameters.charactersPerGlyphBuffer + lastGlyphIndex ); - lineRun.lineSize.width = layout.length; - lineRun.lineSize.height = layout.ascender + layout.descender; + lineRun.width = layout.length; + lineRun.ascender = layout.ascender; + lineRun.descender = layout.descender; lineRun.extraLength = layout.wsLengthEndOfLine; lineRun.direction = false; @@ -481,7 +490,7 @@ struct LayoutEngine::Impl // Update the actual size. actualSize.width = layout.length; - actualSize.height = lineRun.lineSize.height; + actualSize.height = lineRun.ascender + -lineRun.descender; float penX = 0.f; float penY = layout.ascender; @@ -531,8 +540,9 @@ struct LayoutEngine::Impl lineRun.numberOfGlyphs = layout.numberOfGlyphs; lineRun.characterRun.characterIndex = *( layoutParameters.glyphsToCharactersBuffer + index ); lineRun.characterRun.numberOfCharacters = ( *( layoutParameters.glyphsToCharactersBuffer + lastGlyphIndex ) + *( layoutParameters.charactersPerGlyphBuffer + lastGlyphIndex ) ) - lineRun.characterRun.characterIndex; - lineRun.lineSize.width = layout.length + ( ( layout.widthAdvanceDiff > 0.f ) ? layout.widthAdvanceDiff : 0.f ); - lineRun.lineSize.height = layout.ascender + layout.descender; + lineRun.width = layout.length + ( ( layout.widthAdvanceDiff > 0.f ) ? layout.widthAdvanceDiff : 0.f ); + lineRun.ascender = layout.ascender; + lineRun.descender = layout.descender; lineRun.extraLength = layout.wsLengthEndOfLine; lineRun.direction = false; @@ -544,7 +554,7 @@ struct LayoutEngine::Impl actualSize.width = layout.length; } - actualSize.height += lineRun.lineSize.height; + actualSize.height += ( lineRun.ascender + -lineRun.descender ); // Traverse the glyphs and set the positions. @@ -562,7 +572,7 @@ struct LayoutEngine::Impl penX += glyph.advance; } - penY += layout.descender; + penY += -layout.descender; // Increase the glyph index. index += layout.numberOfGlyphs; diff --git a/dali-toolkit/internal/text/line-run.h b/dali-toolkit/internal/text/line-run.h index 7df4bec..a71dc0f 100644 --- a/dali-toolkit/internal/text/line-run.h +++ b/dali-toolkit/internal/text/line-run.h @@ -41,7 +41,9 @@ struct LineRun GlyphIndex glyphIndex; ///< The initial glyph index. Length numberOfGlyphs; ///< The number of glyphs of the run. CharacterRun characterRun; ///< The initial character and the number of characters. - Size lineSize; ///< The size of the line. + float width; ///< The line's width. + float ascender; ///< The line's ascender. + float descender; ///< The line's descender. float extraLength; ///< The length of the white spaces at the end of the line. CharacterDirection direction; ///< Direction of the first character of the paragraph. }; diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index 15d79a1..0796311 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -359,7 +359,7 @@ struct Controller::TextInput // TODO - multi-line selection const Vector& lines = mVisualModel->mLines; - float height = lines.Count() ? lines[0].lineSize.height : 0.0f; + float height = lines.Count() ? lines[0].ascender + -lines[0].descender : 0.0f; mDecorator->SetPosition( PRIMARY_SELECTION_HANDLE, primaryX, 0.0f, height ); mDecorator->SetPosition( SECONDARY_SELECTION_HANDLE, secondaryX, 0.0f, height ); @@ -438,7 +438,8 @@ struct Controller::TextInput const Vector& lines = mVisualModel->mLines; for( float totalHeight = 0; lineIndex < lines.Count(); ++lineIndex ) { - totalHeight += lines[lineIndex].lineSize.height; + const LineRun& lineRun = lines[lineIndex]; + totalHeight += lineRun.ascender + -lineRun.descender; if( y < totalHeight ) { return lineIndex; @@ -515,7 +516,7 @@ struct Controller::TextInput } visualY = 0.0f; - height = line.lineSize.height; + height = line.ascender + -line.descender; } void UpdateCursorPosition() @@ -559,7 +560,8 @@ struct Controller::TextInput lastGlyph = (lineRuns[lineIndex].glyphIndex + lineRuns[lineIndex].numberOfGlyphs); if( cursorGlyph < lastGlyph ) { - height = lineRuns[lineIndex].lineSize.height; + const LineRun& lineRun = lineRuns[lineIndex]; + height = lineRun.ascender + -lineRun.descender; break; } } diff --git a/dali-toolkit/internal/text/text-io.cpp b/dali-toolkit/internal/text/text-io.cpp index 3a0fe9b..3bc1761 100644 --- a/dali-toolkit/internal/text/text-io.cpp +++ b/dali-toolkit/internal/text/text-io.cpp @@ -95,7 +95,9 @@ std::ostream& operator<< (std::ostream& o, const Vector& lineRuns) // e.g. Print "Line 0 Glyphs: 0->9 Characters: 0->9 (10)" for a ten character run staring from beginning of the model o << "Line " << i << " Glyphs: " << lineRuns[i].glyphIndex << "->" << (lineRuns[i].glyphIndex + lineRuns[i].numberOfGlyphs ); o << " Characters: " << lineRuns[i].characterRun.characterIndex << "->" << (lineRuns[i].characterRun.characterIndex + lineRuns[i].characterRun.numberOfCharacters ); - o << " Size: " << lineRuns[i].lineSize; + o << " Width: " << lineRuns[i].width; + o << " Ascender: " << lineRuns[i].ascender; + o << " Descender: " << lineRuns[i].descender; if( i+1 < lineRuns.Count() ) { -- 2.7.4