#include <dali-toolkit/internal/text/layouts/layout-engine.h>
// EXTERNAL INCLUDES
+#include <limits>
#include <dali/public-api/math/vector2.h>
#include <dali/public-api/text-abstraction/font-client.h>
namespace Text
{
+namespace
+{
+
+const float MAX_FLOAT = std::numeric_limits<float>::max();
+
+} //namespace
+
/**
* @brief Stores temporary layout info of the line.
*/
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
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;
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;
}
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;
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;
lineLayout.ascender = tmpLineLayout.ascender;
}
- if( tmpLineLayout.descender > lineLayout.descender )
+ if( tmpLineLayout.descender < lineLayout.descender )
{
lineLayout.descender = tmpLineLayout.descender;
}
tmpLineLayout.widthAdvanceDiff = 0u;
tmpLineLayout.wsLengthEndOfLine = 0u;
tmpLineLayout.ascender = 0.f;
- tmpLineLayout.descender = 0.f;
+ tmpLineLayout.descender = MAX_FLOAT;
return;
}
lineLayout.ascender = tmpLineLayout.ascender;
}
- if( tmpLineLayout.descender > lineLayout.descender )
+ if( tmpLineLayout.descender < lineLayout.descender )
{
lineLayout.descender = tmpLineLayout.descender;
}
tmpLineLayout.widthAdvanceDiff = 0u;
tmpLineLayout.wsLengthEndOfLine = 0u;
tmpLineLayout.ascender = 0.f;
- tmpLineLayout.descender = 0.f;
+ tmpLineLayout.descender = MAX_FLOAT;
}
if( lastFontId != glyphInfo.fontId )
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;
// 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 );
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;
// 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;
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;
actualSize.width = layout.length;
}
- actualSize.height += lineRun.lineSize.height;
+ actualSize.height += ( lineRun.ascender + -lineRun.descender );
// Traverse the glyphs and set the positions.
penX += glyph.advance;
}
- penY += layout.descender;
+ penY += -layout.descender;
// Increase the glyph index.
index += layout.numberOfGlyphs;
// TODO - multi-line selection
const Vector<LineRun>& 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 );
const Vector<LineRun>& 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;
}
visualY = 0.0f;
- height = line.lineSize.height;
+ height = line.ascender + -line.descender;
}
void UpdateCursorPosition()
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;
}
}